如何禁用ParseKit的默认解析器?

时间:2012-02-24 09:39:28

标签: objective-c parsekit

来自Parsekit: how to match individual quote characters?

如果您定义解析器:

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

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

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

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

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

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

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

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

或许我错了。

编辑:

我找到了一个解析加解析的解析器:

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

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

1 个答案:

答案 0 :(得分:2)

ParseKit的开发人员。

我有一些回复。

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

  2. 您将标记符状态分析程序混淆。它们是两个不同的东西,但细节比我在这里可以回答的更复杂。我再次推荐Metsker的书。

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


  4. 现在回答你的问题。

    我认为您正在寻找一种语法,它既可以将++识别为单个多字符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的工作原理。