增强抽象语法树
Augmented Abstract Syntax Tree
这是一个简单的语法:
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 生成的解析器中的语义操作是解决方案,但我想不出来。
有没有简单的方法可以做到这一点?
您建议的输出格式不 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 很容易处理成您需要的任何最终输出。
这是一个简单的语法:
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 生成的解析器中的语义操作是解决方案,但我想不出来。
有没有简单的方法可以做到这一点?
您建议的输出格式不 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 很容易处理成您需要的任何最终输出。