这个ParseKit BNF有什么问题?

时间:2011-07-21 13:55:04

标签: objective-c parsing parser-generator bnf parsekit

我正在使用ParseKit作为Objective-C,它采用类似BNF的语法来指定语法:

@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;

包含最后一行会导致错误。 基本上我想说一个物体可以是房子或其他东西。非终端元素“其他”应该捕获那些不是房子的字。

我是否以错误的方式讨论“任何地方”的想法?

谢谢!

2 个答案:

答案 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令牌的更多信息。