这个ParseKit BNF有什么问题?

9

我正在使用ParseKit来进行Objective-C编程,它采用类似BNF的语法来指定语法规则:

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

包含最后一行会导致错误。基本上我想说一个对象可以是房子或其他东西。非终端元素“other”应该捕获任何不是房子的单词。
我是否对“任何东西-在这里”这个想法有误解?
谢谢!

不行,就像我上面提到的那样。 我认为我做错了什么,如何匹配“任何东西”呢?看看这个电子邮件地址的语法:email = username '@' domain '.com'用户名和域名可以是任何东西,那么我该如何为它们指定规则呢? - FBryant87
1
查看源代码,可能有内置值可以实现此功能。尝试将“other”替换为“Word”。 - Joe
啊,太好了,谢谢。它似乎接受了。你可以简要说明一下“Word”是什么吗? - FBryant87
1
我正在查找,给我一点时间,定义似乎被深深地埋在源代码中。我找到后会发表回答。此外,Word不会满足您的需求,因为它允许名称以数字等开头。 - Joe
3
我无法确定ParseKit的工作原理,但是你基本的问题似乎在于你无法控制“other”的定义,并且似乎没有办法使用ParseKit来定义它(坦率地说,我很惊讶会发现一个解析器生成系统无法以某种方式让你定义标记,但是世界上充满了奇怪的东西)。因此,要么找出ParseKit如何让你定义自己的标记,要么切换到一个明确如何做到这一点的解析器生成系统(经典答案是Flex和YACC)。 - Ira Baxter
显示剩余5条评论
2个回答

6

我是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;

4

根据评论建议,你应该将other 替换为 Word 或者添加一个新规则:

other = Word;

由于 'house' 是一个 Word,所以您也可以直接将 object 规则替换为:

object = Word;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接