Yacc - Exemplo
/* definições de tokens */
%token ID
%%
/* regras */
E: E ‘+‘ E { $$ = $1 + $3; } |
E ‘*‘ E { $$ = $1 * $3; } |
‘(‘ E ‘)‘ { $$ = $2; } |
‘-‘ E { $$ = -$2; } |
ID { $$ = tabsimb(yylval); }
;
%%
/* funções auxiliares */
tabsimb(char[] id){
/* definição da função */
}
/* implementação do analisador léxico */
_______________________________________________________
Programa YACC para uma calculadora de mesa simples
%{
#include <ctype.h>
%}
%token DIGITO
%%
linha : expr '\n' {printf("%d\n", $1); }
;
expr : expr '+' termo { $$ = $1 + $3; }
| termo
termo : termo '*' fator { $$ = $1 * $3; }
| fator
;
fator : '(' expr ')' { $$ = $2; }
| DIGITO
;
%%
yylex () {
int c;
c = getchar ();
if (isdigit (c)) {
yylval = c - '0';
return DIGITO;
}
return c;
}
___________________________________________________________________
Programa YACC para uma calculadora de mesa mais avançada
%{
#include <ctype.h>
#include <stdio.h>
#define YYSTYPE double /* real de precisão dupla para os da pilha
do Yacc */
%}
%token NUMERO
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
linhas : linhas expr '\n' {printf("%g\n", $2); }
| linhas '\n'
| /* e */
;
expr : expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| ' ( ' expr ' ) ' {$$ = $2; }
| ' - ' expr %prec UNIMUS {$$ = - $2; }
| NUMERO
;
%%
yylex () {
int c;
while ((c = getchar () ) == '');
if (( c == '.' ) || isdigit (c)) {
ungetc (c, stdin);
scanf ("%If", &yylval);
return NUMERO;
}
return c;
}