antlr匹配不同的支架零件
我要定义以下语言,显然,ANTLR并没有向easy泄露它的秘密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
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
之外的任何东西