我有以下语言来定义,显然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 {..}
创建自由文本?
答案 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,则表示失败。为什么我明确告诉它匹配OBR
和CBR
以外的任何其他内容。