Objective c ParseKit:我应该在语法中使用哪些内置产品?
我刚开始使用ParseKit来探索语言创建,也许还可以构建一个小型玩具DSL。但是,来自Google的当前SVN主干在解析此语法时抛出了一个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 很明显,我遗漏了一些东西或者错误地配置了我的
-[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