Aula de Compiladores
Considere a gramática definida pelas regras de produção abaixo
Eu utilizei nesse código o ANTLR 2.7 disponível AQUI.
Analisador Sintático
(01) Prog -> programa Declara Bloco fimprog. (02) Declara -> declare Id (, Id)* . (03) Bloco -> (Cmd. )+ (04) Cmd -> CmdLeitura | CmdEscrita | CmdExpr | CmdIf (05) CmdLeitura -> leia( Id ) (06) CmdEscrita -> escreva( Texto | Id ) (07) CmdIf -> se ‘(‘ Expr Op_rel Expr ‘)’ entao ‘{‘ Cmd+ ‘}’ (senao ‘{‘ Cmd+ ‘}’ )? (08) CmdExpr -> Id := Expr (09) Expr -> Expr + Termo | Expr – Termo | Termo (10) Termo -> Termo * Fator | Termo / Fator | Fator (11) Fator -> Num | Id | ( Expr )
Tokens
(01) Op_rel -> ‘<’ | ‘>’ | “<=” | “>=” | “!=” | “==” (02) Texto -> “(0..9 | a..z | A..Z | ‘ ‘ | )+ ” (03) Num -> (0..9)+ (04) Id -> (a..z | A..Z) (a..z | A..Z | 0..9)*
Como podemos observar, as regras sintáticas (09) e (10) possuem recursividade à esquerda e também precisam de fatoração para se tornarem LL(1). Desse modo, temos a sua reescrita baseada no conceito:
E -> E + T | E - T | T
transformamos em:
E -> T E'
E'-> +T E'| -T E' | <Vazio>
que, simplificando, ficamos com:
E -> T ( (+|-)T )*
Desse modo, reescrevendo as regras (09) e (10), temos
(09) Expr -> Termo ( ( + | - ) Termo )*
(10) Termo -> Fator ( ( * | / ) Fator )*
Com isso, nossa gramática fica livre das recursividades e fatorada, tornando-se LL(1). Bora programar!! (Confere a aula no Youtube!!)
Baixe os arquivos AQUI