0

私は次の言語を定義していますが、明らかに ANTLR はその秘密を簡単に公開していません。

ui { 
  screen X {
    input()
    checkbox()
  }
}
model {
 // any text
 // even {}

}

私は定義します

ui: UI OBR (screen)* CBR;

screen: ....

model : MODEL modelBody;

modelBody: BRACKETED_TEXT;

OBR: '{';
CBR: '}';
...
TEXT : ('a'..'z'|'A'..'Z'| '_' | '-' )+ ;
BRACKETED_TEXT : OBR ( ~(OBR|CBR ) | BRACKETED_TEXT )*  CBR;

問題は、その部分MismatchedTokenExceptionを叩いたときにスローされることです。ui {BRACKETED_TEXT トークンを削除するとすべてうまくいくので、解析時に OBR または BRACKETED_TEXT に一致するかどうかを認識できないという事実に違いないと考えていますui {

これは問題ありませんが、構造化された ASTui {...}とフリー テキストを にするにはどうすればよいmodel {..}ですか?

4

1 に答える 1

0

OK、答えは次のようになります。

ui: UI OBR (screen)* CBR;

screen: ....

model : MODEL modelBody;

modelBody: genericBlock; // no more BRACKETED_TEXT

genericBlock
 : OBR
  ( TEXT
  | QUOTED_TEXT
  | OPAR
  | CPAR
  | genericBlock
)*
CBR
 ;

OBR: '{';
CBR: '}';
OPAR: '(';// this was part of the initial grammar file, but left out
CPAR: ')';// same here
...
TEXT : ('a'..'z'|'A'..'Z'| '_' | '-' )+ ;

疑問はまだ残っています。誰かがそれをクリアしてくれることを願っています。汎用ブロックに存在しないすべてのトークンを宣言する必要があるのはなぜですか? lexer が 内で宣言された TOKEN に遭遇した場合genericBlock、彼は失敗します。OBRand以外のものに一致するように具体的に指示したのはなぜですかCBR

于 2013-07-07T19:18:22.093 に答える