在搜索Bison语法时,我发现了以下C语法示例:
https://www.lysator.liu.se/c/ANSI-C-grammar-y.html
logical_and_expression
: inclusive_or_expression
| logical_and_expression AND_OP inclusive_or_expression
;
logical_or_expression
: logical_and_expression
| logical_or_expression OR_OP logical_and_expression
;
我不了解为每个逻辑操作制定规则的原因。下面的这种结构是否有优势?
binary_expression:
: object // imagine it can be bool, int, real ...
| binary_expression AND_OP binary_expression
| binary_expression OR_OP binary_expression
;
您引用的语法是明确的。
尽管yacc / bison允许您使用优先级规则解决歧义,但您建议的模棱两可。
使用语法可以明确显示运算符优先级有一些优点:
这是对该语言的精确描述。优先规则不是语法形式主义的一部分,因此可能很难推理。尤其是,没有通用的方法来证明它们已经完成了期望的工作。
语法是独立的。模棱两可的语法只能通过添加优先级规则来理解。这对于语言标准中使用的语法特别重要,但是通常会影响自动构建其他基于语法的工具的尝试。
显式语法更为通用。并非所有的操作员限制都可以通过数字优先级比较轻松地描述。
优先规则可以通过错误地解决恰好使用某些相同标记的其他地方的移位减少冲突来隐藏语法中的错误。由于未报告已解决的冲突,因此不会警告语法编写者该问题。
另一方面,优先级规则确实具有一些优点:
优先级表紧凑地描述了运算符的优先级,这对于快速参考很有用。
生成的语法需要较少的单位产生,从而稍微提高了解析速度。(通常不明显,但仍然...)
尽管了解冲突的解决方式可能并不明显,但使用优先级声明更容易解决某些冲突。(经典示例是悬而未决的歧义。)这种情况与对运算符优先级的直观理解几乎没有关系,因此,使用优先级规则有点不妥。
语法的总大小实际上不受使用优先级规则的影响。如前所述,优先规则避免了单位生产的需要,但是每个单位生产都对应一个优先声明,因此行的总数是相同的。非终端数量较少,但非终端成本很小;yacc / bison的主要烦人之处在于声明了所有语义类型,但这很容易实现自动化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句