Parsing 为什么这些野牛规则毫无用处?

Parsing 为什么这些野牛规则毫无用处?,parsing,bison,flex-lexer,lex,Parsing,Bison,Flex Lexer,Lex,我正在尝试使用flex和bison创建一个简单的编译器,但是我写下的所有规则都是无用的“14个无用的非终端和66个无用的规则”。是什么让规则变得无用?有没有办法修复它 File: Decl_Class'*' 'EOF' Decl_Class: CLASS IDENT '(' EXTENDS IDENT ')' '?' {Field'*'} Field: Variable |Constructor |Method Variable: Modifier'*' Expr_

我正在尝试使用flex和bison创建一个简单的编译器,但是我写下的所有规则都是无用的“14个无用的非终端和66个无用的规则”。是什么让规则变得无用?有没有办法修复它

File: Decl_Class'*' 'EOF'

Decl_Class: CLASS IDENT '(' EXTENDS IDENT ')' '?' {Field'*'}

Field: Variable
      |Constructor
      |Method

Variable: Modifier'*' Expr_type Decl_variables

Decl_variables: Decl_variable
               |Decl_variable ',' Decl_variables

Decl_variable: IDENT
              |IDENT '=' Expr

Constructor: Modifier'*' IDENT '(' Expr_type | VOID ')' IDENT '(' Params '?' ')' {Instructions'*'}

Method: Modifier'*' '(' Expr_type | VOID ')' IDENT '(' Params '?' ')' {Instructions'*'}

Modifier: IDENT

Expr: IDENT

Params: '(' Expr_type ')' IDENT | '(' Expr_type ')' IDENT ',' Params

Expr_type: BOOLEAN | INT | DOUBLE | IDENT | INTEGER | REAL | TRU | FALS 
                   | THIS | NULLVAL
                   | '(' Expr ')'
                   | Access|Access '=' Expr|Access '(' L_Expr '?' ')'
                   | NEW IDENT '(' L_Expr '?' ')'
                   | '+''+'Expr | '-''-'Expr | Expr'+''+' | Expr'-''-'
                   | '!'Expr | '-'Expr | '+'Expr
                   | Expr Operator Expr
                   | '(' Expr_type ')' Expr_type

Operator: "==" | "!=" | "<" | "<=" | ">" | ">=" | "+" | "-" | "*" | "/" | "%" | "&&" | "||"

Access: IDENT | Expr '.' IDENT

L_Expr: Expr | Expr ',' L_Expr

Instruction: ';'
           | Expr';'
           | Expr_type Decl_variables';'
           | IF '(' Expr ')' Instruction
           | IF '(' Expr ')' Instruction ELSE Instruction
           | WHILE '(' Expr ')' Instruction
           | FOR '(' L_Expr '?' ';' Expr '?' ';'  L_Expr '?'')' Instruction
           | FOR '(' Expr ')' Decl_variables ';' Expr '?' ';'  L_Expr '?'')' Instruction { Instructions'*' }
           | RETURN Expr '?'';'
文件:Decl_类'*''EOF'
Decl_类:类标识'('extensed IDENT')'''''''''''''''''''''''''''''''''''''''extensed IDENT''''''''''''''''''
字段:变量
|建造师
|方法
变量:修饰符“*”Expr\u类型Decl\u变量
Decl_变量:Decl_变量
|Decl_变量“,”Decl_变量
Decl_变量:IDENT
|标识“=”表达式
构造函数:修饰符'*'IDENT'('Expr_type | VOID')'IDENT'('Params'?''){Instructions'*'}
方法:修饰符'*''('Expr_type | VOID')'IDENT'('Params'?''){Instructions'*'}
修饰语:IDENT
Expr:IDENT
参数:'('Expr_type')'IDENT |'('Expr_type')'IDENT','Params
Expr|u type:BOOLEAN | INT | DOUBLE | IDENT | INTEGER | REAL | TRU | FALS
|这个| NULLVAL
|“('Expr')”
|Access | Access'='Expr | Access'('L_Expr'?'')
|新标识“(“L_Expr”?”)
|“+”+“Expr |”-“-”Expr | Expr'+”+“+”| Expr'-“-”
| '!'Expr |'-'Expr |'+'Expr
|Expr运算符Expr
|“(‘Expr_类型’)”Expr_类型
运算符:“=”|“!=”|“=”|“+”|“-”|“*”|“/”|“%”|“&&&“|”|”
访问:IDENT | Expr.”IDENT
L|Expr:Expr | Expr','L|Expr
说明:“;”
|Expr';'
|Expr_类型Decl_变量';'
|IF'('Expr')指令
|IF'('Expr')指令ELSE指令
|而“('Expr')”指令
|对于“(“L_Expr”?”;“Expr”?”;“L_Expr”?”)指令
|对于“('Expr')”Decl_变量“;”表达式“?”;'L_Expr'?''指令{指令'*'}
|返回表达式“?”;'
这里,
{}
中的部分是一个代码操作(编译时会产生语法错误),而不是对
字段
非终端的引用。因此,
字段
从未实际使用过,也没有被它引用的非终端。这就是它们无用的原因:它们从未被使用过

注:在语法中的不同地方,您使用的是
“*”
“?”
,其目的可能是分别匹配零个或多个或零个或一个项目。请注意,所有
“*”
“?”
要做的就是将令牌与给定值匹配。在bison中,没有语法快捷方式可以重复某些内容或使其成为可选的内容-您需要为此定义单独的非终端

PPS:在大多数(所有?)具有
++
-
运算符的语言中,这些运算符由单个标记而不是两个后续的
+'
'-'
标记组成(因此
--x
将是双重否定,只有
-
之间没有空格的
-
将是减量)。因此,减量和增量运算符的规则在这方面是不寻常的

Decl_Class: CLASS IDENT '(' EXTENDS IDENT ')' '?' {Field'*'}