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
}