Compiladores - Lista - 09
Compiladores - Lista - 09
S → if E then S else S
S → begin S L
S → print E
L → end
L→;S L
E → num = num
Abaixo existe um pseudocódigo que implementa um analisador sintático descendente recursivo para
a gramática acima:
int IF=1, THEN=2, ELSE=3, BEGIN=4, END=5, PRINT=6, SEMI=7, NUM=8, EQ=9;
void S(){
switch(token) {
case IF: eat(IF); E(); eat(THEN); S(); eat(ELSE); S(); break;
case BEGIN: eat(BEGIN); S(); L(); break;
case PRINT: eat(PRINT); E(); break;
default: error(); }
}
void L(){
switch(token) {
case END: eat(END); break;
case SEMI: eat(SEMI); S(); L(); break;
default: error(); }
}
void E(){ eat(NUM); eat(EQ); eat(NUM); }
if if IF
then then THEN
else else ELSE
begin begin BEGIN
end end END
print print PRINT
; ; SEMI
[+-]?[0-9]+ num NUM
= = EQ
Observe que a coluna Analisador Léxico (ERs) corresponde as expressões regulares que descrevem
os tokens. A coluna Gramática apresenta a forma como os tokens são classificados, ou seja o
tipo de token. A coluna Pseudocódigo apresenta a forma como o token é identificado dentro do
pseudocódigo.
Um exemplo de cadeia de entrada que deve ser reconhecida pela sua implementação é mostrada a
seguir:
CADEIA ACEITA
Observe que a cadeia não é gerada pela gramática. Desta forma ela deve ser recusada pelo seu
programa, o qual deve apresentar a seguinte mensagem:
Quando ocorrer um erro sintático na cadeia de entrada, o seu programa deve informar o token que
causou o erro bem como o token esperado. O token esperado é determinado através do parâmetro
que a função eat recebe no pseudocódigo. Nas funções associadas a cada não-terminal, quando for
chamada a função de erro, devem-se informar os tokens que seriam esperados pela função na seguinte
ordem:
2
Como exemplo, considere a seguinte cadeia de entrada:
= -666 +666
Uma outra situação que o seu programa deve acusar é quando um erro sintático ocorre em uma
cadeia que em princı́pio possui todos os tokens na possição correta, mas que termina de forma
abrupta. Como exemplo, considere a seguinte cadeia de entrada:
print 666
De modo a testar o seu programa, utilize as entradas e saı́das fornecidas. Utilize o programa diff
para comparar a sua saı́da com a saı́da esperada. Sua saı́da só pode ser considerada correta quando
estiver idêntica à saı́da esperada.