问题: YACC程序实现计算器并识别有效的算术表达式。
解释:
Yacc(表示“另一个编译器”。)是Unix操作系统的标准解析器生成器。 yacc是一个开源程序,它使用C编程语言为解析器生成代码。首字母缩略词通常用小写字母表示,但有时被视为YACC或Yacc。
例子:
Input: 4+5
Output: Result=9
Entered arithmetic expression is Valid
Input: 10-5
Output: Result=5
Entered arithmetic expression is Valid
Input: 10+5-
Output:
Entered arithmetic expression is Invalid
Input: 10/5
Output: Result=2
Entered arithmetic expression is Valid
Input: (2+5)*3
Output: Result=21
Entered arithmetic expression is Valid
Input: (2*4)+
Output:
Entered arithmetic expression is Invalid
Input: 2%5
Output: Result=2
Entered arithmetic expression is Valid
词法分析器源代码:
%{
/* Definition section */
#include
#include "y.tab.h"
extern int yylval;
%}
/* Rule Section */
%%
[0-9]+ {
yylval=atoi(yytext);
return NUMBER;
}
[\t] ;
[\n] return 0;
. return yytext[0];
%%
int yywrap()
{
return 1;
}
解析器源代码:
%{
/* Definition section */
#include
int flag=0;
%}
%token NUMBER
%left '+' '-'
%left '*' '/' '%'
%left '(' ')'
/* Rule Section */
%%
ArithmeticExpression: E{
printf("\nResult=%d\n", $$);
return 0;
};
E:E'+'E {$$=$1+$3;}
|E'-'E {$$=$1-$3;}
|E'*'E {$$=$1*$3;}
|E'/'E {$$=$1/$3;}
|E'%'E {$$=$1%$3;}
|'('E')' {$$=$2;}
| NUMBER {$$=$1;}
;
%%
//driver code
void main()
{
printf("\nEnter Any Arithmetic Expression which
can have operations Addition,
Subtraction, Multiplication, Division,
Modulus and Round brackets:\n");
yyparse();
if(flag==0)
printf("\nEntered arithmetic expression is Valid\n\n");
}
void yyerror()
{
printf("\nEntered arithmetic expression is Invalid\n\n");
flag=1;
}
输出: