これは、いくつかの制約がある単純なアプローチです。これらは、コメントで言及された予想される動作に準拠していると思います。
LPARAM
子リスト内に不一致が表示されることはありません
RPARAM
子リスト内に不一致が表示されることはありません
文法:
start : root+ EOF -> ^(LIST root+ );
root : expr
| LPARAM
| RPARAM
;
expr : list
| atom
;
list : LPARAM expr+ RPARAM -> ^(LIST expr+)
;
atom : INT
;
一致しないとのルールroot
が一致します。ルールを守り、自分のことだけを気にします。LPARAM
RPARAM
list
atom
ルールは と の前にリストするroot
必要があるため、このソリューションは比較的脆弱です。それでも、問題を解決するにはこれで十分かもしれません。expr
LPARAM
RPARAM
テスト ケース 1 : リストなし
入力:1 2 3
出力:
テスト ケース 2 : 1 つのリスト
入力:1 (2) 3
出力:
テスト ケース 3: 2 つのリスト
入力:(1) 2 (3)
出力:
テスト ケース 4 : リストなし、左の不一致
入力:((1 2 3
出力:
テスト ケース 5 : 2 つのリスト、不一致の左
入力:((1 (2) (3)
出力:
テスト ケース 6 : リストなし、権利の不一致
入力:1 2 3))
出力:
テスト ケース 7 : 2 つのリスト、権限の不一致
入力:(1) (2) 3))
出力:
テスト ケース 8 : 2 つのリスト、不一致の左が混在
入力:((1 (2) ( (3)
出力:
テスト ケース 9 : 2 つのリスト、不一致の権限が混在
入力:(1) ) (2) 3))
出力:
[]
との()
ペアを操作するもう少し複雑な文法を次に示します。ペアを追加すると、ソリューションは指数関数的に悪化すると思いますが、楽しいです! また、文法駆動型の AST 構築でできることの限界に達している可能性もあります。
start : root+ EOF -> ^(LIST root+ )
;
root : expr
| LPARAM
| RPARAM
| LSQB
| RSQB
;
expr : plist
| slist
| atom
;
plist : LPARAM pexpr* RPARAM -> ^(LIST pexpr*)
;
pexpr : slist
| atom
| LSQB
| RSQB
;
slist : LSQB sexpr* RSQB -> ^(LIST sexpr*)
;
sexpr : plist
| atom
| LPARAM
| RPARAM
;
atom : INT;
INT : ('0'..'9')+;
LPARAM : '(';
RPARAM : ')';
LSQB : '[';
RSQB : ']';