Programação em LEX
Por: PatrickCabral • 26/11/2015 • Trabalho acadêmico • 334 Palavras (2 Páginas) • 225 Visualizações
/*Parser c++*/
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int yylex();
int yyerror(const char *p) {printf("Error!\n");}
%}
//--valores de Simbolos semanticos-----------------------------------
%union {int ival; float fval; char sym; char *ssym;};
%token <ival> NUM_INT
%token <fval> NUM_FLOAT
%token <ssym> VAR STRING
%token <ssym> IF ELSE WHILE DO FOR SUB
%token <ival> RELOP EQ NE LT LE GT GE
%token <sym> OPA OPS OPM OPD LP RP STOP ATT LCH RCH LCOL RCOL APOSTROFO ASPAS VIRG
%type <ival> expr Num cond
%type <ssym> Vars
%start program
//--REGRAS GRAMATICAIS--------------------------------------------------
%%
program:
| program corpo
| program sub program
| sub program
;
sub: SUB VAR LCH {printf ("inicio def subprograma: %s\n", $2); } corpo RCH {printf("fim def subprograma: %s\n", $2); };
corpo:
| corpo expr
| corpo stmt
| corpo cmd
| expr
| stmt
| cmd
;
stmt:
| VAR ATT expr STOP {printf("atribuição: %s - %d\n", $1, $3);}
| VAR LP RP STOP {printf("chamada de função: %s\n", $1);}
| VAR LP vars RP STOP {printf("chamada de função com parametros: %s\n\t%s\n", $1, $3);}
| VAR vars VAR STOP {printf("chamada de função: %s\n\tparametros: %s\n", $1, $2);}
| VAR VAR STOP {printf("chamada de função: %s\n\tparametros: %s\n", $1, $2);}
| VAR STRING STOP {printf("chamada de função: %s\n", $1);}
| STOP
;
vars:
vars virg var {$$ - $1; strcat($$, ", ");strcat($$, $3);}
| vars VAR {$$ = $1; strcat($$, " ");strcat($$, $2);}
| VAR {$$ = $1;}
;
num:
NUM_INT
| NUM_FLOAT
;
...