antlr匹配括号内的内容

antlr匹配括号内的内容,antlr,antlr3,Antlr,Antlr3,我需要解析以下内容 model { // any content, including brackets {} var x= {} ; // any content, including brackets {} } 如果我这样做: model : MODEL OBR modelBody CBR; modelBody: modelBodyLine; modelBodyLine: TEXT* (OBR TEXT* CBR)* TEXT*; TEXT : ('a'..'z'|'A'.

我需要解析以下内容

model { 

// any content, including brackets {}

var x= {} ; 

// any content, including brackets {}
}
如果我这样做:

model : MODEL OBR modelBody CBR;

modelBody: modelBodyLine;

modelBodyLine: TEXT* (OBR TEXT* CBR)* TEXT*;

TEXT : ('a'..'z'|'A'..'Z'| '_' | '-')+ ;
OBR: '{';
CBR: '}';
我得到这个错误

警告(200):/swlparser/src/ro/sft/SWL/language/Parser/SWL.g:46:16: 决策可以使用多种备选方案匹配输入,如“文本”: 1、2因此,该输入的备选方案2被禁用|--> modelBodyLine:文本*(OBR文本*CBR)*文本*


那么,解析它的最佳方法是什么呢?

对于这些情况,我使用下面的
genericBlock
规则。此规则依赖于lexer至少为最终的
}
正确返回
CBR
标记,并为其创建的每个嵌套
OBR
标记正确匹配
CBR
标记

genericBlock
  : OBR
    ( ~(OBR | CBR)
    | genericBlock
    )*
    CBR
  ;

谢谢你的回答。问题是,如果我试图解析像
model{sometext}
这样的东西,它就会进入一个无限循环。语法如下:
model:modelmodelbody;模型体:genericBlock;通用块:OBR(~(OBR | CBR)|通用块)*CBR。希望您能发现问题:)另一个导致无限循环的模式:
model{var cv=;}
您有一个lexer规则,可以匹配空字符串(例如
WS:'\t'*;
当它应该是
WS:'\t'+;
),并且您有一些输入,但没有lexer规则匹配。