减少/减少jison中clike语法中的冲突



我正在使用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 =

我发现了一个类似的问题,但没有人回答,有人知道如何解决这个问题吗?

这显然是jison中的一个错误,因为语法肯定是LALR(1),并且由bison毫无问题地处理。显然,jison错误地计算了冲突发生状态的前瞻性。(更新:这似乎是错误205,2014年1月报告。)

如果您要求jison生成LR(1)语法分析器而不是LALR(1。然而,我不认为这是一个可持续的解决方案。

这是另一项工作。CCD_ 3和CCD_;"修复"是从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
  ;

相关内容

  • 没有找到相关文章

最新更新