- 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/
如何使用 yyparse() 编译、链接和调用不同的 YACC 语法在一个程序中? 最佳答案 对每个单独的 yacc 语法生成使用 -p 选项 -p prefix Use pr
我正在为类项目工作,我们必须在其中构建解析器。我们目前正处于在 yacc 中构建解析器的阶段。目前让我感到困惑的是,我读到您需要为每个非终结符分配一个类型。在某些情况下,虽然我会有类似的东西: ...
我有一个关于 yacc 编译器的问题。我不编译简单的 yacc 语法。这是代码部分: /*anbn_0.y */ %token A B %% start: anbn '\n' {printf(" is
我正在使用 Yacc 和 lex 来解析 C 类型语言, 我已经使用 C++ 构建了数据结构。 一切正常,但我无法在 main.cpp 中使用 yyin 读取输入文件。 以下是代码: 请帮忙 ! #i
每当找到一些正则表达式时,我都会使用 lex 来执行一些代码, Yacc 还能做更多的事情吗?如果是,那是什么? 最佳答案 lex 和 yacc 通常一起使用。这就是您通常使用以下两种方式构建应用程序
我是 lex 和 yacc 以及编译器设计的新手。我想知道符号表是在哪个阶段(词汇、句法或任何其他阶段)以及如何生成的? 我可以简单描述一下 y.output 文件,该文件是通过向 yacc 提供 -
我正在 yacc 中处理一个项目并且遇到了 shift/reduce 错误,但我不知道为什么我会得到它。我一直在查看 y.output 文件,但不太确定如何阅读它。我的 y.output 文件超出了
我是 yacc/lex 的新手,我正在开发一个由其他人编写的解析器。我注意到,当找到未定义的标记时,解析器返回错误并停止。有没有一种简单的方法可以让它完全忽略它无法解析的行并继续进行下一个? 最佳答案
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
嗨,我正在学习 Lex 和 yacc。我创建了以下 lex 程序。 %{ #include %} %% [0123456789]+ printf("NUMBER\n"); [a-
莱克斯部分: %% [0-9]+ { yyval = atoi (yytext); return num; } %% 雅克部分: %token num %% exp:num '+' num ; {$$
问题 我正在尝试使用 Python Lex-Yacc (PLY) 实现容错解析器,但在输入字符串末尾使用错误恢复规则时遇到问题。 如何从意外的输入结束中恢复? 示例 此示例语法生成以下形式的字符串 A
我有两个带有函数 xxlex() 和 yylex() 的 lex 文件,还有一个 yacc语法文件。我希望语法规则始终调用 xxlex()。但是 xlex() 只被调用一次,我希望它总是被调用。我该怎
我正在尝试使用 PLY (python implementation of yacc) 编写一个相当简单的语法,并且在我想要的时候让 yacc 减少标记字符串时遇到困难。 我想解释一系列采用不同类型参
notype_declarator: notype_declarator '(' parmlist_or_identifiers %prec '.' { $$ = bui
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭12 年前。 Improve th
拜托,我面临一个简单的问题..这就是问题所在,在我的 lex 文件中,我有类似的内容: char *ptr_String; "name = " { BEGIN sName; } .+ {
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
嗨,我正在尝试运行 R. Levine 所著的 lex 和 yacc 书中的 John 代码,我已经使用命令在 Linux 中编译了 lex 和 yacc 程序 lex example.l yacc
我想传递 token 的实际字符串。如果我有一个名为ID的 token ,那么我希望我的yacc文件实际知道称为什么ID。我必须将使用yylval的字符串从flex文件传递到yacc文件。我怎么做?
我是一名优秀的程序员,十分优秀!