Tabla de Símbolos
Construya las tablas de símbolos para cada uno de los bloques del AST.
- Parta de la rama clase12052016 del repo crguezl/pegjscalc
- Cada nodo bloque se decora con un atributo
symbolTable
. Las entradas son los identificadores de objetos declarados en ese bloque (constantes, variables, funciones, ...) los valores son toda la información que pueda recolectar sobre dicho objeto. - El objeto referenciado por el atributo
symbolTable
de un bloque tiene un atributofather
que referencia la tabla de símbolos del bloque que lo anida - El
father
de la tabla de símbolos principal esnull
- Añada un directorio
lib/
al proyecto. Guarde ahí la gramática y el parser generado. - En ese directorio cree un fichero
semantic.js
con el código que se encargará de la fase semántica - Por ahora, vamos a desarrollar en NodeJS: compruebe que puede cargar el módulo
lib/semantic.js
desdemainfromfile.js
- Escriba en
lib/semantic.js
una funcióneachBlockPre(tree, callbackAction, f, ...)
que recorre los bloques/funciones del AST ejecutando sobre cada nodo bloque la accióncallbackAction
que se pasa como parámetro - La callback
callbackAction
recibe como primer argumento el nodo siendo visitadotree
ademas de cualesuiera otros parámetros que hayan sido pasados aeachBlockPre
- Utilice el
eachBlockPre
anterior para construir la tabla de símbolos Durante la construcción de la tabla de símbolos es posible detectar símbolos cuya declaración está duplicada:
[~/srcPLgrado/pegjscalc(symboltable)]$ rake node; ./mainfromfile.js tests/twicedecl.pl0 pegjs lib/pl0.pegjs lib/pl0node.js Processing <*** 1 const A = 4, 2 B = 30, 3 A = 6; 4 var b, n; 5 function fact(n); 6 var t; 7 function tutu(a,b,c); 8 return 4; 9 { 10 if n <= 1 then return 1 11 else return n*fact(n-1); 12 }; 13 { 14 n = 9; 15 b = fact(n); 16 } 17 ***> Constant definition "A" duplicated at line 3
Para mejorar los mensajes de error modifique la fase de análisis sintáctico y añada el atributo
location
a los identificadores. Para ello use la función PegJSlocation
- The code inside the predicate can also access location information using the
location
function. - It returns an object like this:
{ start: { offset: 23, line: 5, column: 6 }, end: { offset: 23, line: 5, column: 6 } }
- The
start
andend
properties both refer to the current parse position. - The
offset
property contains an offset as a zero-based index and line
andcolumn
properties contain a line and a column as one-based indices.```
- The code inside the predicate can also access location information using the
- Mejore los mensajes de error poniéndoles nombres a las reglas