首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在jison中减少/减少类jison语法中的冲突

在jison中减少/减少类jison语法中的冲突
EN

Stack Overflow用户
提问于 2015-12-17 12:50:27
回答 1查看 194关注 0票数 0

我正在使用Jison包开发类似于clike的语言编译器。在引入类之前,我一直做得很好,因此Type现在可以成为LITERAL了。下面是一个简化的语法:

代码语言:javascript
复制
%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
  ;

和杰森的冲突:

代码语言:javascript
复制
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 =

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 16:17:21

这显然是jison中的一个错误,因为语法当然是LALR(1),并且由bison处理,没有问题。显然,jison不正确地计算冲突发生的状态。(Update:这似乎是虫205,2014年1月报道。)

如果您要求jison生成一个LR(1)解析器,而不是LALR(1)语法,那么它将正确地计算出外观,语法在没有警告的情况下传递。然而,我不认为这是一个可持续的解决办法。

这是另一个解决办法。DeclAssign产品是不必要的;“修复”是从Type中删除LITERAL并为其添加单独的产品。

代码语言:javascript
复制
Program
  : EOF
  | Stmt EOF
  ;

Decl
  : Type Ident ';'
  | LITERAL Ident ';'
  ;

Assign
  : Ident '=' NUMBER ';'
  ;

Stmt
  : Decl
  | Assign
  ;

Type
  : INTEGER
  | STRING
  | BOOLEAN
  | VOID
  ;

Ident
  : LITERAL
  ;

您可能需要考虑识别多个语句:

代码语言:javascript
复制
Program
  : EOF
  | Stmts EOF
  ;

Stmts
  : Stmt
  | Stmts Stmt
  ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34335049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档