FBr*_*t87 9 parsing objective-c bnf parser-generator parsekit
我正在使用ParseKit作为Objective-C,它采用类似BNF的语法来指定语法:
@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;
Run Code Online (Sandbox Code Playgroud)
包含最后一行会导致错误.基本上我想说一个物体可以是房子或其他东西.非终端元素"其他"应该捕获那些不是房子的字.
我是否以错误的方式讨论"任何地方"的想法?
谢谢!
这里是ParseKit的开发者.Carmine的答案非常好,你应该听取他的意见.一小部分补充说明:
如果你想让你的Parser代表很容易注意到'house'与任何其他随机单词匹配时,我会将你上面语法的最后一行更改为:
object = house | other;
house = 'house';
other = Word;
Run Code Online (Sandbox Code Playgroud)
然后,您应该在Parser委托中实现以下两个回调方法:
- (void)parser:(PKParser *)p didMatchHouse:(PKAssembly *)a;
- (void)parser:(PKParser *)p didMatchOther:(PKAssembly *)a;
Run Code Online (Sandbox Code Playgroud)
如果您想允许other匹配任何令牌(不仅仅是单词,还包括数字,符号,引用的字符串等),您可以使用内置Any类型.在这种情况下,您可以将上面示例的最后一行更改为:
other = Any;
Run Code Online (Sandbox Code Playgroud)
正如评论中所建议的,您应该替换other为Word或添加新规则:
other = Word;
Run Code Online (Sandbox Code Playgroud)
由于'house'是 a Word,您也可以直接将object规则替换为:
object = Word;
Run Code Online (Sandbox Code Playgroud)
ParseKit 中的A是字符 ( )、数字 ( ) 以及以字符开头的符号、、 和Word的连续序列。您可以在文档中找到有关 ParseKit 令牌的更多信息。[a-zA-Z][0-9]-_'