我正在使用Jison包处理clike语言编译器。在我介绍课程之前我一直很顺利,因此Type
现在可以是LITERAL
。这是一个简化的语法:
%lex
%%
\s+ /* skip whitespace */
int return 'INTEGER'
string return 'STRING'
boolean return 'BOOLEAN'
void return 'VOID'
[0-9]+ return 'NUMBER'
[a-zA-Z_][0-9a-zA-Z_]* return 'LITERAL'
"--" return 'DECR'
<<EOF>> return 'EOF'
"=" return '='
";" return ';'
/lex
%%
Program
: EOF
| Stmt EOF
;
Stmt
: Type Ident ';'
| Ident '=' NUMBER ';'
;
Type
: INTEGER
| STRING
| BOOLEAN
| LITERAL
| VOID
;
Ident
: LITERAL
;
和jison冲突:
Conflict in grammar: multiple actions possible when lookahead token is LITERAL in state 10
- reduce by rule: Ident -> LITERAL
- reduce by rule: Type -> LITERAL
Conflict in grammar: multiple actions possible when lookahead token is = in state 10
- reduce by rule: Ident -> LITERAL
- reduce by rule: Type -> LITERAL
States with conflicts:
State 10
Type -> LITERAL . #lookaheads= LITERAL =
Ident -> LITERAL . #lookaheads= LITERAL =
我发现很多similar question没有得到解答,有没有人知道如何解决这个问题?
答案 0 :(得分:1)
这显然是jison中的一个错误,因为语法肯定是LALR(1),并且被野牛处理没有问题。显然,jison错误地计算了发生冲突的状态的先行。 (更新:2014年1月报道似乎是bug 205。)
如果你让jison产生LR(1)解析器而不是LALR(1)语法,那么它会正确地计算前瞻,并且语法会在没有警告的情况下通过。但是,我认为这不是一个可持续的解决方案。
这是另一种解决方法。 User
和Maybe [Post]
制作不是必需的; “修复”是从Decl
中移除Assign
并为其添加单独的作品。
LITERAL
您可能需要考虑识别多个语句:
Type