【问题标题】:Augmented Abstract Syntax Tree增强抽象语法树
【发布时间】:2016-03-02 23:23:12
【问题描述】:

这是一个简单的语法:

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 生成的解析器中的语义操作是解决方案,但我想不通。

有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: abstract-syntax-tree 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 很容易处理成您需要的任何最终输出。

    【讨论】:

    • 谢谢,这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多