これが私がそれのASTを作ろうとしているものです:
{{ name }}
{{ name | option }}
{{ name | option1 | option2 }}
{{ name | key=value }}
{{ name | option1 | key=value }}
{{ name | option1 | {{ another }} | option3 }}
したがって、実際には常に名前(a..zA..Z0..9)があり、オプションはキー値形式の場合もあれば、単純で値形式のない場合もあります。
ANTLRでレクサー/パーサー文法を書き込もうとしていますが、さまざまなことについてしつこく言い続けています。これが私のベストショットです:
start : box+;
box : '{{' Name ('|' Options )* '}}';
Options : (SimpleOption | KeyValue | box);
Name : ID;
SimpleOption: ID;
KeyValue: ID '=' ID;
fragment
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
WS : ( ' ' | '\t' | '\r' | '\n' {$channel=HIDDEN;} ;
NameとSimpleOptionがあいまいなため、これは明らかに間違っています。インラインルールでさえ役に立たない:
box : '{{' Name ('|' (ID | KeyValue | box) )* '}}';
これは、KeyValueを取得せず、「=」との遭遇時に不一致例外を与えるためです。
この文法をどのように書きますか?