我正在使用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;
我是ParseKit的开发者。Carmine上面的回答很好,你应该听取他的建议。还有一个小提示:
如果您想让解析器委托更容易注意到何时匹配了“house”而不是任何其他随机单词,则应将上面语法的最后一行更改为:
object = house | other;
house = 'house';
other = Word;
- (void)parser:(PKParser *)p didMatchHouse:(PKAssembly *)a;
- (void)parser:(PKParser *)p didMatchOther:(PKAssembly *)a;
other
可以匹配任何标记(不仅是单词,还包括数字、符号、引用字符串等),你可以使用内置的Any
类型。在这种情况下,你需要将上面例子中的最后一行改成:other = Any;
根据评论建议,你应该将other
替换为 Word
或者添加一个新规则:
other = Word;
由于 'house'
是一个 Word
,所以您也可以直接将 object
规则替换为:
object = Word;
Word
是由字符([a-zA-Z]
)、数字([0-9]
)和符号-
, _
, '
组成的连续字符序列,且以字符开头。您可以在文档中找到有关ParseKit令牌的更多信息。