Дополненное абстрактное синтаксическое дерево
Вот простая грамматика:
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 легко обрабатывать в зависимости от того, какой конечный результат вам нужен.