Subtitles translated from English
Showing Revision 2 created 01/31/2013 by Lucilia Figueiredo.
-
Title:
05xps-01 Parsing States Solution
-
Description:
05xps-01 Estados do Parser - Solução
-
Bem vindo à solução do exercício 2.
-
Nesta primeira questão, vamos ver como raciocinar sobre o estado da tabela,
-
quando fazemos o parsing de um token, em uma dada gramática.
-
Aqui, temos uma gramática que define chamadas de função em JavaScript.
-
Digamos que eu tenha uma função -- pow -- que computa a potência de um número,
-
elevado a outro número -- isso não importa de fato.
-
A idéia é que esta função computa 5 elevado a 6,
-
mas o que importa são os tokens aqui.
-
E para mostrar que este string está nesta gramática, vamos caminhar sobre ele.
-
Escrevi aqui nossa primeira regra inicial: S -> id (
-
OPTARGS ).
-
id, neste caso, é pow, e então temos 2 parênteses,
-
e os argumentos, no caso do nosso exemplo, são 5 e 6.
-
Não precisamos ter nada aqui -- como indica o nome, isso é opcional --
-
poderia ser o string vazio; mas nós temos argumentos.
-
Neste caso, temos que ter algum tipo de expressão,
-
ou uma expressão seguida de vírgula, com mais argumentos.
-
E, neste caso, temos 2 -- então, OPTARGS -> ARGS.
-
Não é vazio, então será esta regra.
-
E então, de ARGS, vamos para esta regra,
-
onde exp será 5,
-
temos a vírgula, que casa com a nossa vírgul,.
-
e o retante da regra é ARGS, que vai para --
-
como este é nosso último argumento, vai apenas para exp, que é 6.
-
E pudemos então casar este string com a gramática,
-
usando este conjunto de regras de reescrita.
-
Então, acabei de demonstar como esta gramática casa com chamadas de funçãm em JavaScript.
-
Mas não é exatamente isso que é solicitado na questão.
-
A questão pergunta sobre a tabela.
-
Vamos ver o que acontece quando fazemos parsing de um certo conjunto de tokens.
-
Ao invés de escrever o próprio string, tenho apenas os tokens relevantes.--
-
e, para o problema de parsing, é só isso que nos importa.
-
Isto pode ser casado com o que tínhamos antes,
-
mas o que nos importa são os tokens.
-
Quando eu faço parsing disso, o que queremos saber é:
-
O que está em chart[2], a terceira posição da tabela?
-
E nos foi dado um conjunto de regras que podem estar na tabela.
-
Eu vou examinar cada uma rapidamente. Aqui estão nossas opções.
-
Estamos tentando determinar -- lembre-se -- o que está na segunda entrada da nossa tabela,
-
quando fazemos parsing desta lista de tokens, nesta gramática.
-
E como é uma questão, eu não devom esquecer o símbolo de interrogação.
-
Existem 2 maneiras de resolver isso.
-
A primeira é você construir a tabela à mão.
-
Isso é o que vamos fazer, porque é mais fácil para explicar o que está acontecendo.
-
Uma alternativa, igualmente válida, é usar o código que escrevemos em aula,
-
e modificá-lo para imprimir cada estado da tabela.
-
Isso é provavelmente o que você deveria fazer, se tivesse que responder a várias questões como essa.
-
Mas, como eu disse, para efeito de explicar a resposta, vamos resolver à mão.
-
Ok. Aqui está nossa entrada, e aqui está nossa gramática.
-
Queremos saber o que está em chart[0].
-
Não lemos nada ainda, portanto, estamos no início
-
da regra de reescrita inicial.
-
Incluimos isso em chart[0].
-
Então, agora estamos em chart[1], e já lemos o primeiro token -- id.
-
Vamos apenas fazer shift nesta regra, porque id é o primeiro token desta regra.
-
E isto vem de 0.
-
Então, agora é o momento da verdasde: chart[2].
-
Vamos ver o que podemos fazer.
-
Vamos olhar o token -- é ( -- e vamos fazer shift.
-
Então, aqui existem 2 possibilidades.
-
Uma é que OPTARGS seja vazio --
-
ainda não sabemos, porque não vimos ainda o resto da lista de tokens da entrada.
-
Neste caso, vamos passar OPTARGS.
-
Existe também a possibilidade de que OPTARGS não seja vazio,
-
o que é, de fato, o que acontece na nossa lista de entrada.
-
Então, vamos escrever esses 2 casos.
-
Aqui, eu avancei sobre OPTARGS,
-
presumindo que ele seja vazio, como nesta regra aqui.
-
Então, temos outra opção, onde OPTARGS não é vazio,
-
e vamos ter que processá-lo.
-
Então, olhando esta primeira regra, em nossa tabela temos OPTARGS vazio.--
-
nós temos que garantir que isso seja adicionado:
-
introduzimos isso em chart[2].
-
Temos outro caso, em que OPTARGS não é vazio,
-
e temos que ir para ARGS agora.
-
Então, escrevi aqui as 2 regras para ARGS,
-
e, como ainda não lemos o próximo token, não sabemos nada
-
para poder avançar em qualquer dessas regras,
-
então estamos no início de cada regra.
-
Presumivelmente, o próximo estado na tabela irá fazer shift sobre a nova expressão.
-
Então, agora temos tudo o que precisamos para responder à questão:
-
apenas vamos marcar as opções que estão em chart[2].