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
symbolTablede un bloque tiene un atributofatherque referencia la tabla de símbolos del bloque que lo anida - El
fatherde 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.jscon 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.jsdesdemainfromfile.js - Escriba en
lib/semantic.jsuna funcióneachBlockPre(tree, callbackAction, f, ...)que recorre los bloques/funciones del AST ejecutando sobre cada nodo bloque la accióncallbackActionque se pasa como parámetro - La callback
callbackActionrecibe como primer argumento el nodo siendo visitadotreeademas de cualesuiera otros parámetros que hayan sido pasados aeachBlockPre - Utilice el
eachBlockPreanterior 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 3Para mejorar los mensajes de error modifique la fase de análisis sintáctico y añada el atributo
locationa los identificadores. Para ello use la función PegJSlocation- The code inside the predicate can also access location information using the
locationfunction. - It returns an object like this:
{ start: { offset: 23, line: 5, column: 6 }, end: { offset: 23, line: 5, column: 6 } }- The
startandendproperties both refer to the current parse position. - The
offsetproperty contains an offset as a zero-based index and lineandcolumnproperties 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
