This shows you the differences between two versions of the page.
cpl-atm:laboratoare:laborator5.1 [2013/11/15 12:52] laura.vasilescu created |
cpl-atm:laboratoare:laborator5.1 [2013/11/15 13:58] (current) laura.vasilescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
======== Laborator 5 ======== | ======== Laborator 5 ======== | ||
+ | Scrieți în jison o gramatică (lexer + parser) care generează un arbore AST pentru o expresie matematică cu ''+'' și ''-'': | ||
+ | <code> | ||
+ | expresie: numar termen; | ||
+ | termen: '+' numar termen | '-' numar termen |; | ||
+ | numar: [0-9]+; | ||
+ | </code> | ||
+ | |||
+ | Spre exemplu, pentru expresia ''1+3'', AST-ul arată astfel: | ||
+ | <code> | ||
+ | {"r":"expresie","l":[{"r":"numar","l":["1"]},{"r":"termen","l":["+",{"r":"numar","l":["3"]},null]}]} | ||
+ | </code> | ||
+ | |||
+ | Pentru expresia ''1+3+4'', arată așa: | ||
+ | <code> | ||
+ | {"r":"expresie","l":[{"r":"numar","l":["1"]},{"r":"termen","l":["+",{"r":"numar","l":["3"]},{"r":"termen","l":["+",{"r":"numar","l":["4"]},null]}]}]} | ||
+ | </code> | ||
+ | |||
+ | Practic, în funcție de tipul fiecărui nod, vom returna în parserul din ''jison'' ceva de genul: | ||
+ | <code> | ||
+ | {r:'expresie', l:[$numar,$termen]} | ||
+ | {r:'termen', l:['+',$numar,$termen]} | ||
+ | {r:'termen', l:['-',$numar,$termen]} | ||
+ | {r:'numar', l:[$numar]} | ||
+ | </code> | ||
+ | |||
+ | Prelucrați arborele AST și realizați adnotări de calcule intermediare pentru a evalua expresia. | ||
+ | |||
+ | <note> | ||
+ | <code> | ||
+ | var file=require('./jison.js').parser; | ||
+ | var tree=file.parse("1+3+4"); | ||
+ | console.log(JSON.stringify(tree,null, 4)); | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | Pentru expresia ''1+3'' ar trebui să arate de forma: | ||
+ | <code> | ||
+ | { | ||
+ | "r": "expresie", | ||
+ | "l": [ | ||
+ | { | ||
+ | "r": "numar", | ||
+ | "l": [ | ||
+ | "1" | ||
+ | ], | ||
+ | "valoare": 1 | ||
+ | }, | ||
+ | { | ||
+ | "r": "termen", | ||
+ | "l": [ | ||
+ | "+", | ||
+ | { | ||
+ | "r": "numar", | ||
+ | "l": [ | ||
+ | "3" | ||
+ | ], | ||
+ | "valoare": 3 | ||
+ | }, | ||
+ | null | ||
+ | ], | ||
+ | "valoare": 3 | ||
+ | } | ||
+ | ], | ||
+ | "valoare": 4 | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Pentru expresia ''1+3+4'': | ||
+ | <code> | ||
+ | { | ||
+ | "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 | ||
+ | } | ||
+ | |||
+ | </code> |