Prerrequisito – Introducción a YACC
Problema: Escriba un programa YACC para evaluar una expresión aritmética dada que consta de ‘+’, ‘-‘, ‘*’, ‘/’ incluidos corchetes.
Ejemplos:
Input: 7*(5-3)/2 Output: 7 Input: 6/((3-2)*(-5+2)) Output: -2
Código fuente del analizador léxico:
C
%{ /* Definition section*/ #include "y.tab.h" extern yylval; }% %% [0-9]+ { yylval = atoi(yytext); return NUMBER; } [a-zA-Z]+ { return ID; } [ \t]+ ; /*For skipping whitespaces*/ \n { return 0; } . { return yytext[0]; } %%
Código fuente del analizador:
C
%{ /* Definition section */ #include <stdio.h> %} %token NUMBER ID // setting the precedence // and associativity of operators %left '+' '-' %left '*' '/' /* Rule Section */ %% E : T { printf("Result = %d\n", $$); return 0; } T : T '+' T { $$ = $1 + $3; } | T '-' T { $$ = $1 - $3; } | T '*' T { $$ = $1 * $3; } | T '/' T { $$ = $1 / $3; } | '-' NUMBER { $$ = -$2; } | '-' ID { $$ = -$2; } | '(' T ')' { $$ = $2; } | NUMBER { $$ = $1; } | ID { $$ = $1; }; % % int main() { printf("Enter the expression\n"); yyparse(); } /* For printing error messages */ int yyerror(char* s) { printf("\nExpression is invalid\n"); }
Producción:
Notas:
Los programas Yacc generalmente se escriben en 2 archivos, uno para lex con extensión .l (para tokenización y envío de tokens a yacc) y otro para yacc con extensión .y (para evaluación de gramática y evaluación de resultados).
Pasos para la ejecución del programa Yacc:
yacc -d sample_yacc_program.y lex sample_lex_program.l cc lex.yy.c y.tab.c -ll ./a.out
Publicación traducida automáticamente
Artículo escrito por AashutoshChauhan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA