我正在使用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
;和杰森的冲突:
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 =我发现了一个还没有回答的相似问题,有没有人知道如何解决这个问题呢?
发布于 2015-12-17 16:17:21
这显然是jison中的一个错误,因为语法当然是LALR(1),并且由bison处理,没有问题。显然,jison不正确地计算冲突发生的状态。(Update:这似乎是虫205,2014年1月报道。)
如果您要求jison生成一个LR(1)解析器,而不是LALR(1)语法,那么它将正确地计算出外观,语法在没有警告的情况下传递。然而,我不认为这是一个可持续的解决办法。
这是另一个解决办法。Decl和Assign产品是不必要的;“修复”是从Type中删除LITERAL并为其添加单独的产品。
Program
: EOF
| Stmt EOF
;
Decl
: Type Ident ';'
| LITERAL Ident ';'
;
Assign
: Ident '=' NUMBER ';'
;
Stmt
: Decl
| Assign
;
Type
: INTEGER
| STRING
| BOOLEAN
| VOID
;
Ident
: LITERAL
;您可能需要考虑识别多个语句:
Program
: EOF
| Stmts EOF
;
Stmts
: Stmt
| Stmts Stmt
;https://stackoverflow.com/questions/34335049
复制相似问题