我在理解转换/减少关于语法的转换/减少的问题时遇到了问题,我知道它没有含糊之处。这种情况是if类型之一,但它不是'悬而未决'的问题,因为我有强制性的END子句分隔代码块。转换减少冲突
这里是GPPG语法(它是一种野牛一样编译器编译...这不是一个回声):
%output=program.cs
%start program
%token FOR
%token END
%token THINGS
%token WHILE
%token SET
%token IF
%token ELSEIF
%token ELSE
%%
program : statements
;
statements : /*empty */
| statements stmt
;
stmt : flow
| THINGS
;
flow : '#' IF '(' ')' statements else
;
else : '#' END
| '#' ELSE statements '#' END
| elseifs
;
elseifs : elseifs '#' ELSEIF statements else
| '#' ELSEIF statements else
;
这里是冲突输出:
// Parser Conflict Information for grammar file "program.y"
Shift/Reduce conflict on symbol "'#'", parser will shift
Reduce 10: else -> elseifs
Shift "'#'": State-22 -> State-23
Items for From-state State 22
10 else: elseifs .
-lookahead: '#', THINGS, EOF
11 elseifs: elseifs . '#' ELSEIF statements else
Items for Next-state State 23
11 elseifs: elseifs '#' . ELSEIF statements else
// End conflict information for parser
我已经切换了一切,我确实知道如何解决它,但该解决方案涉及放弃'elseif'上的左递归以获得正确的递归。
香港专业教育学院已通过所有scarse文档我有一个关于这个问题(我张贴在最后的一些链接),并在互联网上发现至今还没有找到一个很好的解决方案。我知道ANTLR,我现在不想考虑它。请将您的解决方案限制为Yacc/Bison解析器。
我会感激优雅的解决方案,我设法做到这一点,通过排除/ *空* /规则和重复所有需要一个空列表,但在更大的语法我在工作它只是结束了像'sparghetti语法症候群' 。
这里有一些链接:
http://nitsan.org/~maratb/cs164/bison.html
http://compilers.iecc.com/comparch/article/98-01-079
是的。我也期待它的工作,你说的最容易理解是对的。但是我确实在解析器上运行了它,并且不幸地给出了4个转换/减少冲突。通过gppg运行并亲自查看。我不明白(得到我的'龙'编译器手册回) – Caerbanog 2008-10-12 23:58:19