
[英]warning: 2 reduce/reduce conflicts [-Wconflicts-rr] in yacc grammar
[英]YACC: grammar has conflicts
我是yacc的新手。 我正在尝试实现类似于Java的语言,在该语言中,我希望语法与以下示例代码兼容:
Class Something {
Main () [
Number i = 0.
While (i < 10) [
If (i % 2 == 0) [
Print(i).
]
i++.
]
Return 0.
]
}
在lex文件中,我声明了令牌,在yacc文件中,提到了非终结符和令牌。
Lex文件:
%{
/* Definition section*/
#include <stdio.h>
#include "yacc-1.tab.h"
extern yylval;
%}
%%
[+-]?[0-9]+|[+-]?[0-9]*"."[0-9]+ { yylval = atoi(yytext); return NUMBER; }
"True"|"False" {return BOOLEAN;}
"If"|"Else"|"While"|"Class"|"Main"|"Number"|"String"|"Boolean"|"Print"|"Return" {return KEYWORD;}
[a-zA-Z_][a-zA-Z_0-9]* { return ID; }
[\"].*[\"] {return STRING;}
"+"|"-"|"/"|"*"|"=" {return OPERATOR;}
"{"|"}"|"["|"]"|"("|")"|","|"." {return SEPARATOR;}
"<"|"<="|"=="|">="|">"|"!=" {return RELOP;}
[\t] + ;
"<!--".*"--!>" ;
\n { return 0; }
. { return yytext[0]; }
%%
int main() {
yylex();
return 0;
Yacc文件:
%{
#include<stdio.h>
%}
%token NUMBER ID STRING BOOLEAN KEYWORD OPERATOR SEPARATOR RELOP
%left "+" "-"
%left "*" "/"
%%
program: block;
block: KEYWORD ID SEPARATOR KEYWORD SEPARATOR vardef slist SEPARATOR SEPARATOR;
vardef: KEYWORD ID SEPARATOR;
slist: statement
| statement SEPARATOR slist;
statement: assignment
|ifstat
|whilestat
|block
|printstat
|empty;
assignment: ID OPERATOR exp;
exp: term newexp| OPERATOR term newexp | STRING newexp
|BOOLEAN newexp
|NUMBER newexp
newexp: OPERATOR exp newexp | empty;
term: factor newterm
newterm: OPERATOR factor newterm | empty;
factor: NUMBER
| ID
| ID exp
| SEPARATOR exp SEPARATOR;
ifstat: KEYWORD SEPARATOR booleanexpression SEPARATOR SEPARATOR slist SEPARATOR
| KEYWORD SEPARATOR booleanexpression SEPARATOR SEPARATOR slist SEPARATOR KEYWORD SEPARATOR slist SEPARATOR;
whilestat: KEYWORD SEPARATOR booleanexpression KEYWORD SEPARATOR slist SEPARATOR;
printstat: KEYWORD SEPARATOR exp SEPARATOR SEPARATOR;
booleanexpression: exp RELOP exp;
empty: ;
%%
语法有许多我似乎无法解决的矛盾。 冲突在哪里发生? 我该如何解决?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.