繁体   English   中英

YACC:语法有冲突

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM