2016-03-01 201 views
0

這裏有一個簡單的語法:增強抽象語法樹

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" 
    ] 
    ] 
] 

有沒有簡單的方法來獲得這樣的ASTs:

[ 
    "int" TYPE, 
    "a" NAME, 
    [ 
    "=" DECL, 
    "4" VAL 
    ], 
    [ 
    "float" TYPE, 
    "b" NAME, 
    [ 
     "=" DECL, 
     "4" VAL 
    ] 
    ] 
] 

或本:

... 
"int TYPE", 
... 

我相信Grako生成的解析器中的語義動作是解決方案,但我無法弄清楚。

有沒有簡單的方法來做到這一點?

回答

2

您提出的輸出格式不兼容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容易處理成您需要的最終輸出。

+0

謝謝,這正是我想要的! –