私はANTLRを使用してKey-Valueデータ形式を解析することを検討してきました。非常に単純ですが、キーは階層を表します。
入力構文の簡単な例:
/a/b/c=2
/a/b/d/e=3
/a/b/d/f=4
私の考えでは、これは次のように構造化されたツリーを表しています。
(a (b (= c 2) (d (= e 3) (= f 4))))
私が得ることができる最も近いものは、次の文法を使用することです:
/* Parser Rules */
start: (component NEWLINE?)* EOF -> (component)*;
component: FORWARD_SLASH ALPHA_STRING component -> ^(ALPHA_STRING component)
| FORWARD_SLASH ALPHA_STRING EQUALS value -> ^(EQUALS ALPHA_STRING value);
value: ALPHA_STRING;
/* Lexer Rules */
NEWLINE : '\r'? '\n';
ALPHA_STRING : ('a'..'z'|'A'..'Z'|'0'..'9')+;
EQUALS : '=';
FORWARD_SLASH : '/';
生成するもの:
(a (b (= c 2))) (a (b (d (= e 3)))) (a (b (d (= f 4))))
ここでANTLRなどの汎用ツールに質問しすぎているかどうかはわかりませんが、これはこのアプローチで得られる限りの近さです。つまり、ここからツリーの一部を使用して、必要なデータ構造を手動で作成します。
では、文法から直接必要なツリー構造を作成できますか?もしそうなら、どのように?そうでない場合は、なぜそうではありませんか?それはANTLRの技術的限界ですか、それとも関連する言語の種類に関係するCS-yのようなものですか?