antlr匹配不同的括号部分

时间:2013-07-07 18:58:12

标签: antlr antlr3

我有以下语言来定义,显然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令牌一切顺利,那么我认为在解析ui {时它无法知道它是否可以匹配OBR或BRACKETED_TEXT。

这很好,但我如何为ui {...}创建结构化AST并为model {..}创建自由文本?

1 个答案:

答案 0 :(得分:0)

好的,答案是这样的:

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'| '_' | '-' )+ ;

问题仍然存在,我希望有人可以清除它。为什么我必须声明通用块中不存在的所有令牌?如果词法分析器在genericBlock内遇到声明的TOKEN,则表示失败。为什么我明确告诉它匹配OBRCBR以外的任何其他内容。