我将 ParseKit 用于 Objective-C,它采用类似 BNF 的语法来指定语法:
@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;
包含最后一行会导致错误。基本上我想说一个对象可以是房子或其他东西。非终结元素“other”应该能捕捉到任何不是房子的词。
我是否以错误的方式谈论“这里的任何东西”的想法?
谢谢!
我将 ParseKit 用于 Objective-C,它采用类似 BNF 的语法来指定语法:
@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;
包含最后一行会导致错误。基本上我想说一个对象可以是房子或其他东西。非终结元素“other”应该能捕捉到任何不是房子的词。
我是否以错误的方式谈论“这里的任何东西”的想法?
谢谢!
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;
正如评论中所建议的,您应该替换other
为Word
或添加新规则:
other = Word;
由于'house'
is a Word
,您也可以直接将object
规则替换为:
object = Word;
Word
ParseKit 中的A是由字符 ( [a-zA-Z]
)、数字 ( ) 和以字符开头[0-9]
的符号-
、_
和组成的连续序列。您可以在文档'
中找到有关 ParseKit 令牌的更多信息。