Дополненное абстрактное синтаксическое дерево

Вот простая грамматика:

START = DECL DECL $ ;
DECL = TYPE NAME '=' VAL ;
TYPE = 'int' | 'float' ;
NAME = 'a' | 'b' ;
VAL = '4' ;

Я анализирую этот поток ввода с Grako:

int a = 4
float b = 4

и я получаю это абстрактное синтаксическое дерево (JSON):

[
  "int",
  "a",
  [
    "=",
    "4"
  ],
  [
    "float",
    "b",
    [
      "=",
      "4"
    ]
  ]
]

Есть ли простой способ получить AST, как это:

[
  "int" TYPE,
  "a" NAME,
  [
    "=" DECL,
    "4" VAL
  ],
  [
    "float" TYPE,
    "b" NAME,
    [
      "=" DECL,
      "4" VAL
    ]
  ]
]

или это:

...
"int TYPE",
...

?

Я полагаю, что семантические действия в сгенерированном Grako парсере - это решение, но я не могу понять это.

Есть ли простой способ сделать это?

1 ответ

Решение

Предлагаемый формат вывода не является JSON-совместимым и не является Python. Используя возможности Grako для настройки AST, вы можете получить выходные данные, которые можно обрабатывать на Python и на любом другом языке, имеющем библиотеку JSON.

Измените грамматику, добавив имя AST к интересующим элементам, например так:

START = DECL DECL $ ;
DECL = TYPE:TYPE NAME:NAME '=' VAL:VAL ;
TYPE = 'int' | 'float' ;
NAME = 'a' | 'b' ;
VAL = '4' ;

И вы получите вывод, как это:

AST:
[AST({'NAME': 'a', 'VAL': '4', 'TYPE': 'int'}), AST({'NAME': 'b', 'VAL': '4', 'TYPE': 'float'})]

JSON:
[
  {
    "TYPE": "int",
    "NAME": "a",
    "VAL": "4"
  },
  {
    "TYPE": "float",
    "NAME": "b",
    "VAL": "4"
  }
]

Полученный AST легко обрабатывать в зависимости от того, какой конечный результат вам нужен.

Другие вопросы по тегам