1

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

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

针对这个输入:

foo

显然,我遗漏了一些东西或错误地配置了我的项目。我能做些什么来解决这个问题?

4

1 回答 1

2

ParseKit的开发者在这里。

首先,请参阅ParseKit 标记化文档

基本上,ParseKit 可以在以下两种模式之一中工作:我们称它们Tokens ModeChars Mode. (这两种模式没有正式名称,但也许应该有。)

Tokens Mode到目前为止更受欢迎。几乎每个使用 ParseKit 的例子都会展示如何使用Tokens Mode. 我相信http://parsekit.com上的所有文档都在使用Tokens Mode. ParseKit 的语法功能(您在示例中使用的仅适用于Tokens Mode)。

Chars Mode是 ParseKit 的一个鲜为人知的功能。我以前从来没有人问过这个问题。

所以模式的区别是:

  • Tokens Mode中,ParseKit Tokenizer 发出多字符标记(如单词、符号、数字、引用字符串等),然后由您创建的 ParseKit 解析器(以编程方式或通过语法)进行解析。
  • Chars Mode中,ParseKit 标记器始终发出单字符标记,然后由您以编程方式创建的 ParseKit 解析器进行解析。(语法目前不适用于此模式,因为此模式不流行)。

您可以使用Chars Mode来实现正则表达式,它在逐个字符的基础上进行解析。


对于您的示例,您应该忽略Chars Mode并仅使用Tokens Mode. 以下内置作品仅供Chars Mode参考。不要在你的语法中使用它们:

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

请注意所有这些作品听起来是如何与单个字符匹配的。那是因为他们这样做。

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

@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
于 2012-12-09T23:48:49.717 回答