如果是一个模糊的文法或生产规则好不好? (野牛移/减少警告)
-
11-09-2019 - |
题
有一定大量文档和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'
作为左或右结合运算符和已覆盖至少该情况。
有关更复杂的图案,只要最终解析器产生正确的结果在所有情况下,警告没有太大的担心。但如果你不能得到它用声明来给出正确的结果,你将不得不重新编写语法。
在我的编译过程中的最后一个学期,我们使用野牛,并建立了一个编译器的帕斯卡的子集。
如果语言是足够复杂,你会有一些错误。只要你明白,为什么他们在那里,你必须做删除这些内容,我们发现这是正常的。如果某样东西在那里,但由于行为会工作,因为我们希望它,并且需要太多太多的思想和工作,使其价值,同时(也是语法复杂),我们离开单干。只要确保你完全理解错误,和地方(甚至你自己)将其记录下来,让你总是知道发生了什么事情吧。
这是一个成本/效益分析,一旦事情变得真正参与进来,但恕我直言,修复它应首先考虑,后来居然找出工作将是什么(如果工间休息别的东西,或做别的事情更难)并从那里走。从未通过它们关闭司空见惯。
当我需要证明一个语法是明确的,我倾向于它先写为解析表达语法,然后将其转换用手任何语法键入我使用项目要求的工具集。根据我的经验,需要对这个级别证明是非常罕见的,虽然,因为大多数移位/减少我所遇到过相当琐碎的人展现的正确性(你的例子中量级)的冲突。