gpt4 book ai didi

bison - Yacc/Bison 单引号和双引号文字之间的区别

转载 作者:行者123 更新时间:2023-12-05 03:14:42 31 4
gpt4 key购买 nike

我有一个使用 Yacc 编写的语法。语法的相关部分摘录在这里

postfix
: primary
| postfix '[' expr ']'
| postfix '[' expr ':' expr ']'
| postfix "." STRING
| postfix '(' ')'
| postfix '(' args ')'
;

unary
: postfix
| '!' unary
| '-' unary
| '+' unary
;

如果您查看后缀定义,您会注意到我在第四条规则中用双引号引起来。我不得不把它放进去,因为没有它我得到了一个转变/减少冲突。我有点困惑为什么当我更改使用的引号类型时转移/减少冲突消失,我怀疑这里发生了什么我错过了。如果有人能解释这些引语的区别以及我应该使用哪一个,我将不胜感激。

最佳答案

在 Bison 中,带单引号和双引号的文字的不同之处在于它们命名不同的标记——因此 '.'"." 是两个不同的标记。在你的语法中同时使用两者被认为是错误的形式,因为它非常困惑。

请注意,只有基于 '单个字符 标记与引号之间的内容有任何实际关系。此类 token 获得的 token 代码等于该单个字符的字符代码。所有其他 token 都获得由 bison 选择的唯一 token 值,仅选择这些 token 以便所有不同的 token 获得不同的 token 编号,除非它们被声明为别名。

因此,虽然 token '.' 将获得 token 代码 46(假设为 ascii),但 token "." 将获得一些其他代码(一些数字大于256).除非您将 "." 的别名声明为某个命名标记,否则词法分析器没有简单的方法知道 "." 的标记代码是什么并返回它。

以上所有仅适用于 Bison ; Berkeley yacc 和 AT&T yacc 不同(彼此不同,也不同于 bison)。


因此,当您更改为 "." 时,shift/reduce 冲突就消失了,因为 '.' 在您的语法中还有其他用途,并且有两种用途'.' 与其他冲突。将一个更改为 "." 会使冲突消失,因为它们现在是词法分析器需要解决的两个不同的标记。当然,由于您的词法分析器可能永远不会返回 "." 标记,这可能不是您想要的。

关于bison - Yacc/Bison 单引号和双引号文字之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23571154/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com