Lex Linguagem e compilador para especificar analisadores lxicos

  • Slides: 12
Download presentation
Lex • Linguagem (e compilador) para especificar analisadores léxicos.

Lex • Linguagem (e compilador) para especificar analisadores léxicos.

Organização Programa fonte lex. l lex. yy. c Entrada *: “cc lex. yy. c

Organização Programa fonte lex. l lex. yy. c Entrada *: “cc lex. yy. c –ll” ou “cc lex. yy. c” Compilador lex (lex ou flex) C compiler* a. out lex. yy. c a. out Sequencia de tokens

Programas Lex - estrutura Declarações – variáveis, constantes, defs. regulares %% regras de tradução

Programas Lex - estrutura Declarações – variáveis, constantes, defs. regulares %% regras de tradução – expr. regulares e ações em C Padrão { Ação } %% procedimentos auxiliares

Lex - exemplo %{ /* definição de constantes LT, LE, EQ, NE, …*/ %}

Lex - exemplo %{ /* definição de constantes LT, LE, EQ, NE, …*/ %} delim [ tn] ws {delim}+ letter [A-Za-z] digit [0 -9] id {letter}({letter}|{digit})* number {digit}+(. {digit}+)? (E[+-]? {digit}+)? %% …

Lex – exemplo (cont. ) … {ws} if then else {id} {number} “<“ “<=“

Lex – exemplo (cont. ) … {ws} if then else {id} {number} “<“ “<=“ %% … {/* no action and no return */} {return(IF); } {return(THEN); } {return(ELSE); } {yylval=install_id(); return(ID); } {yylval=install_num(); return(NUMBER); } {yylval = LT; return(RELOP); } {yylval = LE; return(RELOP); }

Lex – exemplo (cont. ) … int install_id() { Copia lexema para a tabela

Lex – exemplo (cont. ) … int install_id() { Copia lexema para a tabela de símbolos. Primeiro caracter do lexema é apontado pela variável yytext e o comprimento é definido pela variável yyleng. } Int install_num() { … }

Yacc • Linguagem (e compilador) para especificar analisadores sintáticos.

Yacc • Linguagem (e compilador) para especificar analisadores sintáticos.

Organização Programa fonte parser. l Compilador yacc (yacc ou bison -d) y. tab. c

Organização Programa fonte parser. l Compilador yacc (yacc ou bison -d) y. tab. c lex. yy. c C compiler* Entrada a. out *: “cc y. tab. c lex. yy. c –ly” ou “cc y. tab. c lex. yy. c” y. tab. c y. tab. h a. out Resultado da execução do parser

Programas Yacc - estrutura Declarações – variáveis, constantes, definições %% regras de tradução –

Programas Yacc - estrutura Declarações – variáveis, constantes, definições %% regras de tradução – gramática e ações em C Padrão { Ação } %% procedimentos auxiliares

Yacc - exemplo %{ #include <ctype. h> %} %token DIGIT %% …

Yacc - exemplo %{ #include <ctype. h> %} %token DIGIT %% …

Yacc – exemplo (cont. ) line expr : expr 'n' { printf("n%dn", $1); }

Yacc – exemplo (cont. ) line expr : expr 'n' { printf("n%dn", $1); } : expr '+' term { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | term ; term : term '*' factor {$$ = $1 * $3; } | factor ; factor : '(' expr ')' { $$ = $2; } | DIGIT ; %% …

Yacc – exemplo (cont. ) main() { yyparse (); } yylex () { int

Yacc – exemplo (cont. ) main() { yyparse (); } yylex () { int c; c = getchar(); if (isdigit(c)) { yylval = c – ’ 0’; return DIGIT; } return c; }