我刚开始使用ParseKit来探索语言创建,并且可能构建一个小型玩具DSL。但是,来自Google的当前SVN中继在解析此语法时会抛出-[PKToken intValue]: unrecognized selector sent to instance ...
:
@start = identifier ;
identifier = (Letter | '_') | (letterOrDigit | '_') ;
letterOrDigit = Letter | Digit ;
反对这一输入:
foo
显然,我遗漏了某些内容或者错误地配置了我的项目。我该怎么做才能解决这个问题?
答案 0 :(得分:2)
ParseKit的开发人员。
首先,请参阅ParseKit Tokenization docs。
基本上,ParseKit可以使用以下两种模式之一:让我们称它们为Tokens Mode
和Chars 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