首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增广抽象语法树

增广抽象语法树
EN

Stack Overflow用户
提问于 2016-03-01 19:55:08
回答 1查看 297关注 0票数 0

下面是一个简单的语法:

代码语言:javascript
复制
START = DECL DECL $ ;
DECL = TYPE NAME '=' VAL ;
TYPE = 'int' | 'float' ;
NAME = 'a' | 'b' ;
VAL = '4' ;

我用Grako解析这个输入流:

代码语言:javascript
复制
int a = 4
float b = 4

然后检索这个抽象语法树(JSON):

代码语言:javascript
复制
[
  "int",
  "a",
  [
    "=",
    "4"
  ],
  [
    "float",
    "b",
    [
      "=",
      "4"
    ]
  ]
]

是否有一种简单的方法可以获得这样的AST:

代码语言:javascript
复制
[
  "int" TYPE,
  "a" NAME,
  [
    "=" DECL,
    "4" VAL
  ],
  [
    "float" TYPE,
    "b" NAME,
    [
      "=" DECL,
      "4" VAL
    ]
  ]
]

或者这个:

代码语言:javascript
复制
...
"int TYPE",
...

我相信在Grako生成的解析器中的语义操作是解决方案,但我无法解决。

有什么简单的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-02 15:23:12

您建议的输出格式与JSON不兼容,也不是Python。通过使用Grako的特性进行AST定制,您可以获得可以用Python和任何具有JSON库的其他语言处理的输出。

通过向感兴趣的元素添加AST名称来修改语法,如下所示:

代码语言:javascript
复制
START = DECL DECL $ ;
DECL = TYPE:TYPE NAME:NAME '=' VAL:VAL ;
TYPE = 'int' | 'float' ;
NAME = 'a' | 'b' ;
VAL = '4' ;

你会得到这样的输出:

代码语言:javascript
复制
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很容易处理成您需要的任何最终输出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35732219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档