减少错误有人可以帮助我处理这个 lex 和 grammer 代码

Posted

技术标签:

【中文标题】减少错误有人可以帮助我处理这个 lex 和 grammer 代码【英文标题】:REDUCE ERRORS can some one help me with this lex and grammer code 【发布时间】:2019-06-13 18:05:26 【问题描述】:

这是我的语法:

%% Start : _PROGRAM _ID _SEMI Block
Block : Declarations BlockStatements
Declarations : _VAR _LPAREN VariableDeclarions _SEMI _RPAREN _ADD 
               | ;
VariableDeclarions : _ID _LPAREN _COMMA _ID _RPAREN _MULT _COLON TypeSpec
TypeSpec : _INTEGER 
           | _REAL
BlockStatements : _BEGIN Statements _END 
                  | ;
Statements : Assignment W 
             | ;
W : Statements
Statement : Assignment 
            | ;
Assignment : _ID _ASSIGN Expr _SEMI
Expr : Term _LPAREN _ADD Term _RPAREN _MULT 
       | Term _LPAREN _SUB Term _RPAREN _MULT 
       | Term _LPAREN _MULT 
       | Term _LPAREN _DIV _RPAREN _MULT
Term : _CONST 
       | _LPAREN Expr _RPAREN 
       | _ID

我收到如下错误: 2 条规则从未减少。

谁能帮我解决问题?

我无法纠正语法。

【问题讨论】:

请添加您收到的实际错误消息。 2 条规则从未减少 不相关。标记名称在 C 程序中成为符号——enum 成员,如果您使用的是 flex——则它们需要符合 C 命名规则。并且 C 命名规则保留所有以下划线和大写字母开头的名称,因此使用这些名称是 C 标准的未定义行为。如果您不想只使用通常的约定的单词,您可以使用T_TOK_ 之类的前缀来修饰它们,而不仅仅是一个下划线。 【参考方案1】:

当我通过bison 运行您的语法时(添加缺少的%token 定义后),我得到以下输出:

bla.y: warning: 1 nonterminal useless in grammar [-Wother]
bla.y: warning: 2 rules useless in grammar [-Wother]
bla.y:17.1-9: warning: nonterminal useless in grammar: Statement [-Wother]
 Statement : Assignment

所以根据输出的最后一部分,Statement 是无用的。因此,让我们看看Statement 在语法中的使用位置:它不是。你定义了Statement,但你从不在任何地方使用它。所以这就是它没用的原因,也是你收到警告的原因。

【讨论】:

以上是关于减少错误有人可以帮助我处理这个 lex 和 grammer 代码的主要内容,如果未能解决你的问题,请参考以下文章

VB6 Parser / Lexer / Scripter

lex & yacc 文件中的语法错误

unity3d 如何UI优化和减少DC(DrawCall)

使用lex---01

有条件地组合/减少密钥对

YACC和LEX,在行尾获取语法错误,无法弄清楚原因