АСТ, как бороться с пустыми узлами - PullRequest
1 голос
/ 22 марта 2019

Я строю оценщик выражений, используя Java, JFlex (lexer gen) и Jacc (genser parser).Мне нужно:

  • сгенерировать лексер
  • сгенерировать парсер
  • сгенерировать AST
  • отобразить график AST
  • оценить выражение

Мне удалось создать лексер и парсер и AST.Сейчас я пытаюсь сделать график AST, используя шаблон посетителя, но это сделало проблему с моим сгенерированным AST очевидной (так сказать).В моем калькуляторе мне нужно обрабатывать скобки, и они создают пустые узлы в моем AST (и это делает мое дерево разбора не AST, я полагаю).Вот соответствующая часть моей грамматики:

Calc : /* empty */
    | AddExpr                   { ast = new Calc($1); }
    ;

AddExpr : ModExpr
    | AddExpr '+' ModExpr       { $$ = new AddExpr($1, $3, "+"); }
    | AddExpr '-'   ModExpr     { $$ = new AddExpr($1, $3, "-"); }
    ;

ModExpr : IntDivExpr
    | ModExpr MOD IntDivExpr    { $$ = new ModExpr($1, $3); }
    ;

IntDivExpr : MultExpr
    | IntDivExpr DIV MultExpr   { $$ = new IntDivExpr($1, $3); }
    ;

MultExpr : UnaryExpr
    | MultExpr '*' UnaryExpr    { $$ = new MultExpr($1, $3, "*"); }
    | MultExpr '/' UnaryExpr    { $$ = new MultExpr($1, $3, "/"); }
    ;

UnaryExpr : ExpExpr
    | '-' UnaryExpr             { $$ = new UnaryExpr($2, "-"); }
    | '+' UnaryExpr             { $$ = new UnaryExpr($2, "+"); }
    ;

ExpExpr : Value                 
    | ExpExpr '^' Value         { $$ = new ExpExpr($1, $3); }
    ;

Value : DoubleLiteral           
    | '(' AddExpr ')'           { $$ = new Value($2); }
    ;

DoubleLiteral : DOUBLE          { $$ = $1; }
    ;

Вот пример выражения:

1*(2+3)/(4-5)*((((6))))

и полученное изображение:

enter image description here

Это оставляет мне Value узлов для каждой пары скобок.У меня есть несколько идей о том, как с этим справиться, но я не уверен, что делать дальше:

  • Попытайтесь обработать это в моей грамматике (не уверен, как, поскольку мне не разрешено использовать директивы приоритетов)
  • Обработайте это в моем оценщике

1 Ответ

3 голосов
/ 22 марта 2019

Если вам не нужны Value узлы, просто замените { $$ = new Value($2); } на { $$ = $2; }.

...