簡體   English   中英

增強抽象語法樹

[英]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易於處理為所需的最終輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM