有一定大量文档和HOWTO的关于解决移/减少错误。野牛文档提出正确的解决方案通常是只%希望他们和处理它。

当你有这样的事情:

S: S 'b' S | 't'

您可以轻松地解决这些问题是这样的:

S: S 'b' T | T
T: 't'

我的问题是:它是更好地离开语法触摸暧昧和%预计移动/减少的问题还是更愿意尝试调整语法来避免呢?我怀疑有一个平衡,它是基于笔者的需求,但我真的不知道。

有帮助吗?

解决方案

当我读它,你的问题是,“何时是一个模糊的文法或生产规则OK?”

首先考虑你所描述的语言。什么是允许一个模糊的产生式规则到语言的含义。

您实施例描述了语言可能包括像的表达式:t b t b t b t

在表达式,解析为在第二个例子是(((( t ) b t) b t ) b t )但为暧昧语法它也可能成为( t b ( t b ( t b ( t))))甚至( t b t ) b ( t b t )。这可能是有效的可能取决于语言。如果b操作模式减法,它真的不应该含糊,但如果是另外,它可能是好的。这实际上取决于语言。

第二个要考虑的问题是什么产生的语法源文件最终看起来像,在解决冲突后。与其他源代码,语法是指由人来阅读,其次也是由电脑。喜欢一个符号,让什么样的解析器正试图从语法做更清楚的解释。也就是说,如果分析器正在执行一些可能未定义的行为,例如,函数参数的计算顺序在渴望的语言,使语法的的暧昧。

其他提示

您可以引导冲突解决与运算符优先级。声明'b'作为左或右结合运算符和已覆盖至少该情况。

有关更复杂的图案,只要最终解析器产生正确的结果在所有情况下,警告没有太大的担心。但如果你不能得到它用声明来给出正确的结果,你将不得不重新编写语法。

在我的编译过程中的最后一个学期,我们使用野牛,并建立了一个编译器的帕斯卡的子集。

如果语言是足够复杂,你会有一些错误。只要你明白,为什么他们在那里,你必须做删除这些内容,我们发现这是正常的。如果某样东西在那里,但由于行为会工作,因为我们希望它,并且需要太多太多的思想和工作,使其价值,同时(也是语法复杂),我们离开单干。只要确保你完全理解错误,和地方(甚至你自己)将其记录下来,让你总是知道发生了什么事情吧。

这是一个成本/效益分析,一旦事情变得真正参与进来,但恕我直言,修复它应首先考虑,后来居然找出工作将是什么(如果工间休息别的东西,或做别的事情更难)并从那里走。从未通过它们关闭司空见惯。

当我需要证明一个语法是明确的,我倾向于它先写为解析表达语法,然后将其转换用手任何语法键入我使用项目要求的工具集。根据我的经验,需要对这个级别证明是非常罕见的,虽然,因为大多数移位/减少我所遇到过相当琐碎的人展现的正确性(你的例子中量级)的冲突。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top