Problema: Programa YACC para implementar una Calculadora y reconocer una expresión Aritmética válida.
Explicación:
Yacc (por «otro compilador compilador más») es el generador de analizador estándar para el sistema operativo Unix. Un programa de código abierto, yacc genera código para el analizador en el lenguaje de programación C. El acrónimo generalmente se representa en minúsculas, pero ocasionalmente se ve como YACC o Yacc.
Ejemplos:
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
Código fuente del analizador léxico:
%{ /* Definition section */ #include<stdio.h> #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; }
Código fuente del analizador:
%{ /* Definition section */ #include<stdio.h> 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; }
Producción:
Publicación traducida automáticamente
Artículo escrito por thakur_aman y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA