-
Title:
05xps-05 Parsing Javascript Expressions Solution
-
Description:
05xps-05 Parser para Expressões JavaScript - Solução
-
Neste problema, vamos construir parte do nosso
-
parser para JavaScript, que trata expressões JavaScript.
-
Isso é muito fácil e direto, assim como
-
o último problema, onde essencialmente
-
enumeramos todas as regras que predefinimos
-
para nossa linguagem JavaScript. Então, vamos direto
-
ao IDE.
-
Aqui temos que fornecer o código para
-
o problema e, se olharmos mais de perto, veremos que
-
quase todas as regras do parser estão enumeradas,
-
exatamente como deveriam ser: temos "identifier",
-
"numbers", "strings", "true" e "false", como tratar a
-
palavra chave "not", e depois expressões.
-
Temos também a relação de precedência de
-
e de associatividade para cada uma
-
dessas operações.
-
Então, temos realmente tudo o que precisamos, na
-
descrição do problema, para este problema.
-
E, como você pode ver, eu já preenchi
-
a ordem de precedência das operações.
-
E isso é obtido diretamente do comentário
-
dado no problema, onde "or" é listado na
-
precedência mais baixa, e prosseguimos até
-
a divisão, aqui. Eu adicionei também o "not",
-
para fazer isso funcionar.
-
Então vamos começar a preencher as regras.
-
Minha primeira regra vai tratar parênteses: se temos um casamento de
-
parênteses à esquerda e à direita, a expressão correspondente
-
é simplesmente o conteúdo dos parênteses -- bem fácil.
-
E agora eu tenho 4 regras para
-
alguns dos nossos valores literais: temos "number" --
-
vamos dizer "number" e o conteúdo disso --
-
temos "string" -- simplesmente dizemos "string" -- e,
-
se casamos com "true" ou "false", vamos retornar
-
as tuplas especificadas. Se vemos um "not",
-
então simplesmente temos na nossa árvore do parser a palavra "not"
-
e então o conteúdo que está sendo negado.
-
Depois disso, temos mais ou menos uma dúzia de regras
-
para operadores binários: adição, subtração, multiplicação, módulo,
-
divisão etcetera etcetera. E, para economizar espaço --
-
eu poderia enumerar cada função, mas quero
-
um atalho -- eu digo que, se casamos com
-
qualquer dessas coisas, eu chamo uma operação binária,
-
sendo o primeiro elemento o operando à esquerda
-
da operação binária, a entrada seguinte
-
na tupla é a operação a ser usada,
-
e a última é
-
o operando à direita da operação binária.
-
E agora eu tenho expressões para chamada de funções,
-
não para declarações, que nós vimos no último problema.
-
Uma chamada de função será um
-
identificador, com argumentos opcionais, entre parênteses.
-
E o código para tratar argumentos opcionais
-
é quase exatamente o mesmo que
-
o código que usamos para tratar argumentos opcionais
-
na declaração de função. De fato, eu acho que é
-
exatamente o mesimo. E, com tiudo isso, terminamos.
-
São mais ou menos 50 linhas de codigo e estamos felizes.