Как создать абстрактные узлы синтаксического дерева, когда оператор и операнды не находятся в одном производстве? - PullRequest
0 голосов
/ 14 апреля 2019

Таким образом, во всех случаях примеров AST, есть производства следующего вида:

    expr -> expr "+" expr;
    expr -> expr "-" expr;

And in this case it's easy to create a new node like this:

    expr: expr "+" expr {newNode("+",$1,$3);}
    ;

Теперь моя грамматика имеет следующую реализацию:

    assignment:IDENTIFIER '=' expression ';' 
    ;
    expression:term expression_1
    ;
    expression_1: '+' term expression_1 |
    '-' term expression_1 |
    ;
    term: factor term_1 
    ;
    term_1: '*' factor term_1 |
    '/' factor term_1 |
    ;
    factor: IDENTIFIER |
    '(' expression ')' | 
    NUM | FNUM | STRING
    ;

Здесь, делаяновый узел, как мне взять первый операнд (который находится в предыдущем производстве) и передать его в функцию newNode, которая будет иметь оператор и второй операнд (оба они вместе в другом производстве)?

...