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;

}

 

 


VoltarHomePróximoe-mail