YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Portuguese, Brazilian subtitles

← 05xps-04 Parsing Javascript Statements Solution

05xps-04 Parsing de comandos Javascript

Get Embed Code
3 Languages

Showing Revision 2 created 02/03/2013 by Lucilia Figueiredo.

  1. Neste problema e no próximo, vamos construir
  2. uma grande parte do nosso parser para Javascript.
  3. Em particular, vamos primeiro focar nos
  4. comandos JavaScript, Para tornar isso mais simples,
  5. vamos considerar apenas 6 tipos de comandos.
  6. if-then -- basicamente, você tem apenas o comando if.
  7. if-then-else -- aqui vamos tratar
  8. um comando JavaScript tal como este,
  9. mas que tem também o else. O primeiro tipo
  10. de comando tem apenas esta parte,
  11. enquanto o if-then-else trata tudo isso.
  12. Vamos também fazer atribuição, tal como em x = 5;
  13. o comando return -- um exemplo disso,
  14. em JavaScript, seria assim: temos
  15. a palavra chave return, seguida de uma expressão --
  16. aqui temos simplesmente 5. Há ainda mais 2 comandos.
  17. um envolvendo declarações, usando a
  18. palavra chave var -- isso declara a variável x, inicializando-a
  19. com o valor 5, enquanto isso atribiu 5 mais tarde.
  20. E o último tipo que vamos tratar neste problema
  21. é simplesmente a existência de uma expressão.
  22. Você pode ter uma expressão no meio
  23. do seu código JavaScript.
  24. Portanto, ao invés disso aqui, poderíamos ter
  25. apenas 5. Isso não faz nada, mas
  26. é o número 5, e é código JavaScript válido.
  27. Então, isso é bem simples, se você seguir as regras
  28. que foram dadas no topo do programa.
  29. Vamos diretamente para o IDE e trabalhar nisso,
  30. cada um por um. Aqui está meu interpertador,
  31. pronto para começarmos a resolver esta questão.
  32. Aqui eu tenho a regra para função e
  33. vamos escrever isso. Aqui, estou dizendo ao parser
  34. que isso será uma regra de parsing para
  35. o não terminal element, e vou chamar esta aqui
  36. de regra de parser para função. A primeira coisa é
  37. um string, que diz ao parser quando aplicar esta regra.
  38. Então, aqui estou dizendo que um element produz
  39. o terminal FUNCTION, um IDENTIFIER, depois LEFTPAREN,
  40. alguns parâmetros opcionais, RIGHTPAREN,
  41. seguido de um comando composto.
  42. E uma vez que isso case, eu vou fazer
  43. de modo que element seja a tupla com
  44. a palavra "fucntion", o nome da função --
  45. que é um IDENTIFIER, os parâmetros opcionais --
  46. que é o valor p[4] -- e p[6] é o
  47. comando composto. Um element pode
  48. também ser um stmt,
  49. que é algum tipo de comando,
  50. seguido de SEMICOLON.
  51. A tupla com que ele casa terá a palavra "stmt",
  52. e o conteúdo deste comando.
  53. Aqui, eu tenho minhas 2 regras para parâmetros opcionais
  54. e, como o nome indica, parâmetros podem
  55. ser opcionais, de modo que nosso `params' pode ser
  56. vazio ou pode ser uma sequência de parâmetros.
  57. Um parâmetro é um IDENTIFIER,
  58. seguido de COMMA e de mais parâmetros,
  59. ou pode ser apenas um -- ou o último parâmetro --
  60. que é um IDENTIFIER.
  61. Note como eu coloquei o identificador em uma lista,
  62. porque params é sempre uma lista, mesmo que com
  63. apenas um elemento. Um comando composto é
  64. uma sequência de comandos entre LBRACE e RBRACE.
  65. E agora ss regras para comandos:
  66. stmts pode ser vazio -- podemos não ter nada
  67. entre LBRACE e RBRACE -- ou
  68. pode ser um único comando, e um SEMICOLON,
  69. seguido de mais comandos.
  70. Agora vamos definir comando -- stmt.
  71. Vamos começar com if: se temos um comando if,
  72. vamos colocá-lo em uma tupla, da árvore de parsing,
  73. onde o primeiro componente da tupla é
  74. o string "if" -- que indica que é um comando if --
  75. o segundo componente é
  76. a expressão do comando if, e
  77. o último componente da tupla é
  78. o comando composto que constitui o then.
  79. Em um if-then-else temos uma estrutura similar,
  80. exceto que temos também um else,
  81. que será um componente adicional na tupla,
  82. que é a sequência de comandos que
  83. é executada se a expressão não é
  84. avaliada para TRUE.
  85. Aqui temos a atribuição: é um IDENTIFIER,
  86. digamos `x', EQUAL -- o sinal `=' -- e
  87. depois uma expressão, digamos 5, e, no parser,
  88. você vai colocar "assign", o identificador e, depois,
  89. a expressão que é atribuída ao identificador.
  90. Para o return, vamos simplesmente colocar "return,
  91. e depois a expressão que é retornada.
  92. Usamos a palavra chave VAR para declarar e
  93. inicializar uma variável, e então vamos ter
  94. a palavra chave "var", seguida de um identificador,
  95. o sinal EQUAL e uma expressão com a qual queremos
  96. iniciaiizar a variável -- o idenditicador e a expressão.
  97. Para tornar isso um pouco mais concreto,
  98. seria como se tivéssemos feito isto, e a tupla
  99. que colocamos na nossa árvore de parsing seria ("var","x",5).
  100. Por último, dizemos que stmt -> exp,
  101. que ainda não definimos, e vamos guardar para o próximo problema.
  102. Com isso tudo junto,
  103. temos grande parte do nosso parser para JavaScript.
  104. Bem, pelo menos a parte que trata de comandos.