【发布时间】:2014-10-03 21:59:31
【问题描述】:
我正在使用 lex 和 yacc。以下是 lex 和 yacc 计算器的程序。在执行 yacc 文件时。请帮我解决这个问题。我收到以下错误:
这是错误:
conflicts: 20 shift/reduce
//YACC程序
%{
#include<stdio.h>
#include<math.h>
extern void printsymbol();
struct symboltable
{
char name[20];
double value;
}ST[20];
%}
%union
{
double p;
}
%token <p> NUM
%token <p> IDENTIFIER
%token SIN COS TAN ROOT
%left '+' '-'
%left '*' '/'
%type <p> E
%%
Edash:E';'{printf("\n=%f",$1);printsymbol();}
|Edash E';'{printf("\n=%f",$2);printsymbol();}
E: E'+'E {$$=$1+$3;}
|E'-'E {$$=$1-$3;}
|E'*'E {$$=$1*$3;}
|E'/'E {$$=$1/$3;}
|NUM {$$=$1;}
|IDENTIFIER {$$=ST[(int)]$1.value;}
|'('E')' {$$=$2;}
|IDENTIFIER'='E {$$=ST[(int)]$1.value=$3;}
|SIN E {$$=sin($2*3.141/180);}
|COS E {$$=sin($2*3.141/180);}
|TAN E {$$=sin($2*3.141/180);}
|ROOT E {$$=sqrt($2);}
%%
int main()
{
yyparse();
}
yyerror()
{
printf("Error Found..!");
}
【问题讨论】:
-
一些历史版本的“One True Awk”源代码在语法上有多达 96 个 shift/reduce 冲突。查看这个历史悠久的存储库:github.com/danfuzz/one-true-awk 所以,如果您不知道如何操作 Yacc,那么您和贝尔实验室的一些名人一起工作!
标签: yacc