1

次の簡単な文法を考えてみましょう。

grammar test;

options {  
  language = Java; 
  output = AST;
}                     
//imaginary tokens
tokens{ 
}


parse
    : declaration
    ;

declaration
    : forall
    ;
forall
    :'forall' '('rule1')' '[' (( '(' rule2 ')' '|' )* ) ']' 
    ;
rule1
    : INT
    ;
rule2
    : ID
    ;
ID  
    : ('a'..'z' | 'A'..'Z'|'_')('a'..'z' | 'A'..'Z'|'0'..'9'|'_')*
    ;
INT 
    : ('0'..'9')+
    ;
WHITESPACE
    : ('\t' | ' ' | '\r' | '\n' | '\u000C')+ {$channel = HIDDEN;}
    ;

ここに入力があります

forall (1) [(first) | (second) | (third) | (fourth) | (fifth) |]  

文法は上記の入力では正常に機能しますが、入力から余分なパイプ記号(入力の最後から2番目の文字)を削除したいと思います。
何か考え/アイデアはありますか?

4

1 に答える 1

1

私のantlr構文は少し錆びていますが、次のようなものを試してみてください。

forall
    :'forall' '('rule1')' '[' ('(' rule2 ')' ('|' '(' rule2 ')' )* )? ']' 
    ;

つまり、(r|)*書き込みの代わりに(r(|r)*)?。後者が、パイプを間に挟んだゼロ、1つ、または多くのルールをどのように許可するかを確認できます。

于 2012-12-19T15:58:29.100 に答える