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