1

来自Parsekit:如何匹配单个引号字符?

如果定义解析器:

@start = int;
int = /[+-]?[0-9]+/

不幸的是,它不会解析任何以“+”为前缀的整数,除非您包括:

@numberState = "+" // at the top.

在上面的数字解析中,甚至没有提到“符号”默认解析器,但它仍然处于活动状态并覆盖用户定义的解析器。

好的,对于数字,您仍然可以通过添加指令来修复它。如果您尝试为“++”创建解析器怎么办?我还没有找到任何可以使以下解析器工作的指令。

@start = plusplus;
plusplus = "++";

默认解析器对用户解析器的影响似乎如此随意。为什么我不能解析“++”?

是否可以完全关闭默认解析器?如果我不做一些常见的事情,他们似乎会妨碍我。

或者也许我错了。

编辑:

我找到了一个可以解析 plus plus 的解析器:

@start = plusplus;
plusplus = plus plus;
plus = "+";

我猜答案是:解析器中定义的文字符号不能在默认解析器之间重叠;它必须至少被其中一次完全收容。

4

1 回答 1

2

ParseKit的开发者在这里。

我有几个回应。

  1. 我想你会发现 ParseKit API 非常优雅和明智,你学的越多。请记住,我这样说并不是在自吹自擂。虽然我构建了 ParseKit,但我没有设计 ParseKit API。相反,ParseKit 的设计几乎完全基于Steven Metsker 的Building Parsers In Java中的设计。如果您想深入了解 ParseKit,我强烈建议您查看这本书。另外,这是一本关于解析的很棒的书。

  2. 您将Tokenizer StatesParsers混淆了。它们是两个截然不同的东西,但细节比我在这里能回答的要复杂得多。再次,我推荐 Metsker 的书。

  3. 在回答您的问题的过程中,我确实在 ParseKit 中发现了一个小错误。谢谢!但是,它不会影响您上面描述的结果,因为您没有使用正确的语法来获得您想要的结果。你现在需要从 The Google Code Project更新你的源代码,否则我下面的建议对你不起作用。


现在回答你的问题。

我认为您正在寻找一种语法,它既可以识别++为单个多字符Symbol标记,也可以将带有前导+字符的数字识别为显式正数,而不是一个+ Symbol标记后跟一个Number标记。

我相信您正在寻找的正确语法是这样的:

@symbols = '++';    // declare ++ as a multi-char symbol
@numberState = '+'; // allow explicitly-positive numbers
@start = (Number|Symbol)*;

像这样输入:

++ +1 -2 + 3 ++

将像这样被标记化:

[++, +1, -2, +, 3, ++]++/+1/-2/+/3/++^

两个提醒:

  1. 同样,您现在需要更新源代码才能正常工作。在这种情况下,我必须修复一个错误。
  2. 这东西很棘手,我建议阅读 Metsker 的书以充分了解 ParseKit 的工作原理。
于 2012-02-24T19:51:10.093 回答