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

次のような AST を取得する簡単な方法はありますか。

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

またはこれ:

...
"int TYPE",
...

?

Grako で生成されたパーサーのセマンティック アクションが解決策だと思いますが、わかりません。

これを行う簡単な方法はありますか?

4

1 に答える 1

2

あなたが提案する出力形式は JSON 互換ではなく、Python ではありません。AST のカスタマイズに Grako の機能を使用することで、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 は、必要な最終出力に簡単に処理できます。

于 2016-03-02T15:23:12.780 に答える