Laborator 5

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
}
cpl-atm/laboratoare/laborator5.1.txt · Last modified: 2013/11/15 13:58 by laura.vasilescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0