Parsing 为什么这些野牛规则毫无用处?
我正在尝试使用flex和bison创建一个简单的编译器,但是我写下的所有规则都是无用的“14个无用的非终端和66个无用的规则”。是什么让规则变得无用?有没有办法修复它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_
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'*'}