0

ゴール

パーサーで 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 コードが埋め込まれた文法へと一線を越えています。

4

1 に答える 1

0

パーサーは、次のようなものを問題なく処理する必要があります。

isWidget(int) : "Whether it is a widget" : "foo" ;

つまり、この場合に失敗する述語を追加しないでください。そうしないと、正常なエラー メッセージを報告できなくなります。代わりに、解析が完了した後に言語固有のリスナーまたはビジターの実装を使用して、デフォルト値の型が宣言された型と一致しない場合にセマンティックエラーを報告します。

于 2013-09-22T22:28:50.143 に答える