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规则匹配。