2016-03-01 3 views
0

Voici une grammaire simple:Résumé Augmentée Syntaxe Arbre

START = DECL DECL $ ; 
DECL = TYPE NAME '=' VAL ; 
TYPE = 'int' | 'float' ; 
NAME = 'a' | 'b' ; 
VAL = '4' ; 

Je Parse ce flux d'entrée avec Grako:

int a = 4 
float b = 4 

et je récupère cet arbre de syntaxe abstraite (JSON):

[ 
    "int", 
    "a", 
    [ 
    "=", 
    "4" 
    ], 
    [ 
    "float", 
    "b", 
    [ 
     "=", 
     "4" 
    ] 
    ] 
] 

Existe-t-il un moyen simple d'obtenir des AST comme ceci:

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

ou ceci:

... 
"int TYPE", 
... 

? Je crois que les actions sémantiques dans l'analyseur généré par Grako sont la solution, mais je ne peux pas le comprendre.

Existe-t-il un moyen simple de faire cela?

Répondre

2

Le format de sortie que vous proposez n'est pas compatible avec JSON et ce n'est pas Python. En utilisant les fonctionnalités de Grako pour la personnalisation AST, vous pouvez obtenir une sortie qui peut être traitée en Python et dans tout autre langage qui a une bibliothèque JSON.

Modifier la grammaire en ajoutant un nom d'AST aux éléments d'intérêt, comme celui-ci:

START = DECL DECL $ ; 
DECL = TYPE:TYPE NAME:NAME '=' VAL:VAL ; 
TYPE = 'int' | 'float' ; 
NAME = 'a' | 'b' ; 
VAL = '4' ; 

Et vous obtiendrez une sortie comme ceci:

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

L'AST résultant est facile à traiter dans quelle sortie finale vous avez besoin.

+0

Merci, c'est exactement ce que je voulais! –