ゴール
パーサーで Java 固有のアクションと述語を削減 (または削除) したいと考えています。おそらくそれは不可能ですが、見逃した ANTLR4 機能がある場合に備えて、ここで質問したいと思います。(言語自体はサードパーティであるため、私はそれを制御できません。)
簡単な例
私が使用したい述語は、ほとんどが正確な (またはおそらく大文字と小文字を区別しない) 文字列一致です。パーサー ルールの大きな並列セットを作成することもできますが、実際の例はかなり複雑であるため、作成したくはありません。
次のようなものが与えられたとします。
isWidget(int) : "Whether it is a widget" : 4 ;
ownerFirstName(string) : "john" ;
ownerLastName(string) : "This is the last-name of the owner" : "doe" ;
パーサーにデフォルト値 (行の最後の項目、4
、"john"
または など) を見て、以前のタイプ, ,"doe"
に基づいて解析するようにします。(int)
(string)
(string)
main
: stmt SEMIC (stmt SEMIC)* EOF
;
stmt
: propname=IDENTIFIER LPAREN datatype=IDENTIFIER RPAREN (COLON description=QUOTSTRING)? COLON df=defaultVal
;
defaultVal
: QUOTSTRING //TODO only this alt if datatype=string
| NUM //TODO only this alt if datatype=int
;
fragment Letter : 'a'..'z' | 'A'..'Z' ;
fragment Digit : '0'..'9' ;
fragment Underscore : '_' ;
SEMIC : ';' ;
COLON : ':' ;
LPAREN : '(' ;
RPAREN : ')' ;
IDENTIFIER : (Letter|Underscore) (Letter|Underscore|Digit)* ;
QUOTSTRING : '"' ~('"' |'\n' | '\r' | '\u2029' | '\u2028')* '"' ;
NUM : Digit+ ;
WS : [ \t\n\r]+ -> skip ;
述語とルール入力でそれができることはわかっていますが、言語にとらわれない文法から Java コードが埋め込まれた文法へと一線を越えています。