9

我将 ParseKit 用于 Objective-C,它采用类似 BNF 的语法来指定语法:

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

包含最后一行会导致错误。基本上我想说一个对象可以是房子或其他东西。非终结元素“other”应该能捕捉到任何不是房子的词。

我是否以错误的方式谈论“这里的任何东西”的想法?

谢谢!

4

2 回答 2

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类型。在这种情况下,您可以将上面示例的最后一行更改为:

other = Any;
于 2011-10-14T15:46:15.600 回答
4

正如评论中所建议的,您应该替换otherWord或添加新规则:

other = Word;

由于'house'is a Word,您也可以直接将object规则替换为:

object = Word;

WordParseKit 中的A是由字符 ( [a-zA-Z])、数字 ( ) 和以字符开头[0-9]的符号-_和组成的连续序列。您可以在文档'中找到有关 ParseKit 令牌的更多信息。

于 2011-08-19T14:48:26.043 回答