antlr匹配不同的支架零件

antlr匹配不同的支架零件,antlr,antlr3,Antlr,Antlr3,我要定义以下语言,显然,ANTLR并没有向easy泄露它的秘密 ui { screen X { input() checkbox() } } model { // any text // even {} } 我会定义 ui: UI OBR (screen)* CBR; screen: .... model : MODEL modelBody; modelBody: BRACKETED_TEXT; OBR: '{'; CBR: '}'; ... TEXT

我要定义以下语言,显然,ANTLR并没有向easy泄露它的秘密

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;
问题是,当点击
ui{
部分时,它抛出了一个
MismatchedTokenException
。如果我删除括号内的文本标记,一切都会顺利,所以我想这一定是因为它在解析
ui{
时不知道它是否可以匹配OBR或括号内的文本


这很好,但是我如何为
ui{…}
构建AST和为
model{…}
构建自由文本呢?

好的,答案如下:

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在
泛型块
中遇到声明的令牌,他就失败了。为什么我特别告诉它匹配除
OBR
CBR
之外的任何东西