2013-03-10 112 views
1

我正在写野牛的简单解析器。分析程序检查程序是否有任何语法错误就我下面的语法:去除野牛的歧义

%{ 
#include <stdio.h> 
void yyerror (const char *s) /* Called by yyparse on error */ 
{ 
    printf ("%s\n", s); 
} 
%} 
%token tNUM tINT tREAL tIDENT tINTTYPE tREALTYPE tINTMATRIXTYPE 
%token tREALMATRIXTYPE tINTVECTORTYPE tREALVECTORTYPE tTRANSPOSE 
%token tIF tENDIF tDOTPROD tEQ tNE tGTE tLTE tGT tLT tOR tAND 
%left "(" ")" "[" "]" 
%left "<" "<=" ">" ">=" 
%right "=" 
%left "+" "-" 
%left "*" "/" 
%left "||" 
%left "&&" 
%left "==" "!=" 

%% /* Grammar rules and actions follow */ 
prog: stmtlst ; 
stmtlst: stmt | stmt stmtlst ; 
stmt: decl | asgn | if; 
decl: type vars "=" expr ";" ; 
type: tINTTYPE | tINTVECTORTYPE | tINTMATRIXTYPE | tREALTYPE | tREALVECTORTYPE 
     | tREALMATRIXTYPE ; 
vars: tIDENT | tIDENT "," vars ; 
asgn: tIDENT "=" expr ";" ; 
if: tIF "(" bool ")" stmtlst tENDIF ; 
expr: tIDENT | tINT | tREAL | vectorLit | matrixLit | expr "+" expr| expr "-" expr 
    | expr "*" expr | expr "/" expr| expr tDOTPROD expr | transpose ; 
transpose: tTRANSPOSE "(" expr ")" ; 
vectorLit: "[" row "]" ; 
matrixLit: "[" row ";" rows "]" ; 
row: value | value "," row ; 
rows: row | row ";" rows ; 
value: tINT | tREAL | tIDENT ; 
bool: comp | bool tAND bool | bool tOR bool ; 
comp: expr relation expr ; 
relation: tGT | tLT | tGTE | tLTE | tNE | tEQ ; 
%% 
int main() 
{  
    if (yyparse()) { 
     // parse error 
     printf("ERROR\n"); 
     return 1; 
    } 
    else { 
     // successful parsing 
     printf("OK\n"); 
     return 0; 
    } 
} 

的代码可能漫长而复杂,但我想我要问并不需要完整的代码,但在任何情况下我都喜欢写代码。我相信我的语法是正确的,但是含糊不清。当我尝试通过编写“bison -d filename.y”来创建程序的可执行文件时,我收到一个错误,说冲突:13 shift/reduce。我在这个文件的开头定义了运算符的优先级,我尝试了很多这些优先级的组合,但是我仍然得到这个错误。我如何消除这种歧义?谢谢

+0

你能列出shift/reduce错误吗? – valtron 2013-03-10 22:55:23

+0

我该怎么做? – yrazlik 2013-03-10 22:56:39

+0

它只是说冲突:13 shift/reduce – yrazlik 2013-03-10 22:56:57

回答

3

tOR,tANDtDOTPROD也需要指定它们的优先顺序。

+0

也有关联性。 – 2013-03-10 23:16:28