ParseKit:我应该在Grammars中使用哪些内置制作?

时间:2012-12-09 23:27:05

标签: objective-c parsing parsekit

我刚开始使用ParseKit来探索语言创建,并且可能构建一个小型玩具DSL。但是,来自Google的当前SVN中继在解析此语法时会抛出-[PKToken intValue]: unrecognized selector sent to instance ...

@start = identifier ;
identifier = (Letter | '_') | (letterOrDigit | '_') ;
letterOrDigit = Letter | Digit ;

反对这一输入:

foo

显然,我遗漏了某些内容或者错误地配置了我的项目。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

ParseKit的开发人员。

首先,请参阅ParseKit Tokenization docs

基本上,ParseKit可以使用以下两种模式之一:让我们称它们为Tokens ModeChars Mode。 (这两种模式没有正式的名称,但也许应该有。)

到目前为止,

Tokens Mode更受欢迎。实际上,您将找到使用ParseKit的每个示例都将展示如何使用Tokens Mode。我相信http://parsekit.com上的所有文档都在使用Tokens Mode。 ParseKit的语法功能(您在示例中使用的功能仅适用于Tokens Mode)。

Chars Mode是ParseKit的一个鲜为人知的特性。我以前从来没有人问过这件事。

因此模式的差异是:

  • Tokens Mode中,ParseKit Tokenizer发出多字符标记(如Words,Symbols,Numbers,QuotedStrings等),然后由您创建的ParseKit解析器解析(以编程方式或通过语法)。
  • Chars Mode中,ParseKit Tokenizer始终发出 single-char 标记,然后由您以编程方式创建的ParseKit解析器进行解析。 (语法目前不适用于此模式,因为此模式不受欢迎)。

您可以使用Chars Mode来实现常规表达式,这些表达式以char-by-char为基础进行解析。

<小时/> 对于您的示例,您应该忽略Chars Mode并使用Tokens Mode。以下内置制作仅适用于Chars Mode。不要在你的语法中使用它们:

(PK)Letter
(PK)Digit
(PK)Char
(PK)SpecificChar 

请注意所有这些Productions听起来如何匹配各个字符。那是因为他们这样做了。

上面的示例应该如下所示:

@start = identifier;
identifier = Word; // by default Words start with a-zA-Z_ and contain -0-9a-zAZ_'

请记住,语法中的制作(像identifier这样的解析器)将处理已经从ParseKit的Tokenizer发出的标记。不是个人的角色。

IOW:当您的语法开始解析输入时,输入已经被标记为Word,Number,Symbol,QuotedString等类型的标记。

以下是您可以在语法中使用的所有内置制作:

Word
Number 
Symbol
QuotedString
Comment
Any
S // Whitespace. only available when @preservesWhitespaceTokens=YES. NO by default.

此外:

DelimitedString('start', 'end', 'allowedCharset')
/xxx/i // RegEx match

还有复合解析器的运算符:

  // Sequence
| // Alternation
? // Optional
+ // Multiple
* // Repetition
~ // Negation
& // Intersection
- // Difference