- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 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/
我有一个使用 Yacc 编写的语法。语法的相关部分摘录在这里 postfix : primary | postfix '[' expr ']' | postfix '[' ex
如何在 bison/yacc 中使用继承的属性? 说,我有这样的语法 - 程序 -> stmts 我想做的是在 Bison 身上: 程序:stmts {$$.next = newLabel(); $1
有什么方法可以更改 Bison 错误消息的格式?例如,不要说 syntax error, unexpected T_ID, expected ';' or T_IMPORT说 unexpected i
我的语法有这两个标记声明: %token RP %token ELSE 而这两条规则: Statement : IF LP Exp RP Statement; Statement : IF LP
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我希望为现有语言创建一个 JavaScript 解析器,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。我想使用 Jison,并且也一直在尝试学习 Bison 的基础知识。 我不确定如何回
目前我正在研究一个源到源编译器,我已经编写了一个野牛解析器,可以正确地为输入创建 AST。我现在需要对语法树进行多次转换,因此我需要向树中插入许多节点。 我可以手动创建所有要添加到语法树中的结构体/联
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我正在寻找为现有语言创建 JavaScript 解析器的方法,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。想用Jison,也在努力学习Bison的基础。 一个我不确定如何回答的问题是
我正在使用 flex/bison 编写解析器(我可以用 Python 编写解析器,但我总是更喜欢经典。) 当我用这个编译代码时: gcc -lfl -ly chance.tab.c lex.yy.c
正在使用 flex/bison 开发编译器。我的构建输出中有此警告。 警告:在默认操作中键入冲突 ('s' '') 请问有什么帮助吗? 最佳答案 它似乎与源中的 %token 和 %type 声明有关
考虑这个 lex.l 文件: %{ #include "y.tab.h" %} digit [0-9] letter [a-zA-Z] %% "+"
我正在为 bison 中的一个简单的 Pascal 编译器编写语法,我想可视化我在 pascal.y 中指定的语法的解析树。是否可以基于我的 pascal.y 文件以图形方式显示语法树? 最佳答案 野
我正在尝试编写一个能够使用以下输入的语法: begin #this is a example x = 56; while x > 0 do begin point 15
我正在尝试使用 BNF 语法编写 Flex/Bison 文件。但是,当我尝试编译时出现错误,而且我不确定如何调试它们。 BNF语法: ::= | head() ::=:: | @ | tail() |
我正在用 Flex/Bison 编写一个小程序来标记/解析我创建的查询语言。 我想知道是否有任何方法可以在 Flex/Bison 中创建任何关键字。 我的意思是:flex 将输入分解成一个标记列表,但
我正在尝试使用 flex 和 bison 创建过滤器,因为我想从复杂的语言中获取某些语法元素。我的计划是使用 flex + bison 来识别语法,并转储出感兴趣元素的位置。 (然后使用脚本根据转储的
我正在尝试实现一个可以进行浮点运算的 Flex/bison 计算器。我的 Flex 代码如下所示 %{ #include "calc.tab.h" #include void yyerror(cha
我正在尝试使用 FLEX 和 BISON 进行一些练习。 这是我写的代码: calc_pol.y %{ #define YYSTYPE double #include "calc_pol.tab.h"
我有一个使用括号和方括号作为分隔符的语法。当由 bison 生成的解析器输入带有不平衡分隔符的输入时,传递给 yyerror 的 YYLTYPE* 中的错误位置是输入的结尾。所以,例如,在输入 x
我是一名优秀的程序员,十分优秀!