Apostila antiga - The Cyan Programming Language
Apostila antiga - The Cyan Programming Language
Apostila antiga - The Cyan Programming Language
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
CHAPTER 2. A ANÁLISE SINTÁTICA 18<br />
A gramática resultante já está fatorada.<br />
Freqüentemente, a recursividade de um não terminal como Expr ′ é transformado em iteração pelo<br />
uso dos símbolos { e } na gramática, que indicam “repita zero ou mais vezes”. Assim,<br />
A ::= a{b}<br />
gera as sentenças<br />
a<br />
ab<br />
abbbb<br />
aplicando esta notação para a gramática anterior, obtemos<br />
Expr ::= Term { (+|−) Term }<br />
Term ::= Numero { (∗|/) Numero }<br />
onde +|− significa + ou −.<br />
2.5 Análise Sintática Descendente<br />
A análise sintática (parsing) de uma seqüência de tokens determina se ela pode ou não ser gerada por<br />
uma gramática. A seqüência de tokens é gerada pelo analisador léxico a partir do programa fonte a<br />
ser compilado.<br />
Existem diversos métodos de análise sintática e o método que estudaremos a seguir é chamado de<br />
descendente, pois ele parte do símbolo inicial da gramática e faz derivações buscando produzir como<br />
resultado final a seqüência de tokens produzida pelo analisador léxico. Um exemplo simples de análise<br />
descendente é analisar<br />
2 + 3<br />
a partir da gramática<br />
E ::= T E ′<br />
E ′ ::= + T E ′ | ɛ<br />
T ::= N T ′<br />
T ′ ::= ∗ N T ′ | ɛ<br />
N ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9<br />
onde +, ∗ e os dígitos 0...9 são terminais. Inicialmente, marcamos o primeiro símbolo da entrada com<br />
sublinhado e começamos a derivar a partir do símbolo inicial E:<br />
2 + 3$<br />
E<br />
O $ foi acrescentado ao final da entrada para representar o token “fim de arquivo”. Marcaremos<br />
com sublinhado o próximo símbolo sendo considerado da forma sentencial derivada de E. À esquerda<br />
do sublinhado estarão apenas terminais que já foram acasalados com a entrada.<br />
Como só existe uma alternativa para derivar E, assim fazemos:<br />
2 + 3$<br />
T E ′<br />
Existe também uma única alternativa para T:<br />
2 + 3$<br />
N T ′ E ′<br />
Agora N possui 10 alternativas e escolheremos aquela que acasala (match) com o token corrente da<br />
entrada:<br />
2 + 3$<br />
2 T ′ E ′<br />
Quando o token corrente da entrada, também chamado de símbolo lookahead, for igual ao terminal da<br />
seqüência derivada de E, avançamos ambos os indicadores de uma posição, indicando que o token da