Objective c ParseKit:我应该在语法中使用哪些内置产品?

Objective c ParseKit:我应该在语法中使用哪些内置产品?,objective-c,parsing,parsekit,Objective C,Parsing,Parsekit,我刚开始使用ParseKit来探索语言创建,也许还可以构建一个小型玩具DSL。但是,来自Google的当前SVN主干在解析此语法时抛出了一个-[PKToken intValue]:未识别的选择器发送到实例…: @start = identifier ; identifier = (Letter | '_') | (letterOrDigit | '_') ; letterOrDigit = Letter | Digit ; 根据这一输入: foo 很明显,我遗漏了一些东西或者错误地配置了我的

我刚开始使用ParseKit来探索语言创建,也许还可以构建一个小型玩具DSL。但是,来自Google的当前SVN主干在解析此语法时抛出了一个
-[PKToken intValue]:未识别的选择器发送到实例…

@start = identifier ;
identifier = (Letter | '_') | (letterOrDigit | '_') ;
letterOrDigit = Letter | Digit ;
根据这一输入:

foo
很明显,我遗漏了一些东西或者错误地配置了我的项目。如何解决此问题?

此处的开发者

首先,请参阅

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

Tokens模式
目前比较流行。实际上,使用ParseKit的每个示例都将演示如何使用
Tokens模式
。我相信上的所有文档都在使用
Tokens模式
。ParseKit的语法功能(您在示例中使用的语法功能仅在
令牌模式下工作)

Chars模式
是ParseKit的一个鲜为人知的特性。我以前从未有人问过这件事

因此,两种模式的区别是:

  • Tokens模式下
    ,ParseKit标记器发出多字符标记(如单词、符号、数字、引号字符串等),然后由您创建的ParseKit解析器(通过编程或语法)解析
  • Chars模式下
    ,ParseKit标记器始终发出单个char标记,然后由以编程方式创建的ParseKit解析器解析。(由于此模式不受欢迎,语法当前不适用于此模式)
您可以使用
Chars模式
来实现规则表达式,该表达式在逐字符的基础上进行解析


例如,您应该忽略
Chars模式
,而只使用
Tokens模式
。以下内置产品仅适用于
字符模式
。不要在语法中使用它们:

(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的标记器发出的标记。不是单个字符

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

以下是可在语法中使用的所有内置产品:

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

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

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

好的,那么需要注意的是,
Word
的PK默认值已经有了
identifier
的隐式定义,因此我的定义是多余的,难以在PK的令牌模式下解析?因此,只需更改
标识符=单词应该足以让我回到正轨?谢谢
  // Sequence
| // Alternation
? // Optional
+ // Multiple
* // Repetition
~ // Negation
& // Intersection
- // Difference