Scrieți în jison o gramatică (lexer + parser) care generează un arbore AST pentru o expresie matematică cu +
și -
:
expresie: numar termen; termen: '+' numar termen | '-' numar termen |; numar: [0-9]+;
Spre exemplu, pentru expresia 1+3
, AST-ul arată astfel:
{"r":"expresie","l":[{"r":"numar","l":["1"]},{"r":"termen","l":["+",{"r":"numar","l":["3"]},null]}]}
Pentru expresia 1+3+4
, arată așa:
{"r":"expresie","l":[{"r":"numar","l":["1"]},{"r":"termen","l":["+",{"r":"numar","l":["3"]},{"r":"termen","l":["+",{"r":"numar","l":["4"]},null]}]}]}
Practic, în funcție de tipul fiecărui nod, vom returna în parserul din jison
ceva de genul:
{r:'expresie', l:[$numar,$termen]} {r:'termen', l:['+',$numar,$termen]} {r:'termen', l:['-',$numar,$termen]} {r:'numar', l:[$numar]}
Prelucrați arborele AST și realizați adnotări de calcule intermediare pentru a evalua expresia.
var file=require('./jison.js').parser; var tree=file.parse("1+3+4"); console.log(JSON.stringify(tree,null, 4));
Pentru expresia 1+3
ar trebui să arate de forma:
{ "r": "expresie", "l": [ { "r": "numar", "l": [ "1" ], "valoare": 1 }, { "r": "termen", "l": [ "+", { "r": "numar", "l": [ "3" ], "valoare": 3 }, null ], "valoare": 3 } ], "valoare": 4 }
Pentru expresia 1+3+4
:
{ "r": "expresie", "l": [ { "r": "numar", "l": [ "1" ], "valoare": 1 }, { "r": "termen", "l": [ "+", { "r": "numar", "l": [ "3" ], "valoare": 3 }, { "r": "termen", "l": [ "+", { "r": "numar", "l": [ "4" ], "valoare": 4 }, null ], "valoare": 4 } ], "valoare": 7 } ], "valoare": 8 }