0

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

这很好,但我怎样才能为 AST 构建 ASTui {...}和自由文本model {..}

4

1 回答 1

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

问题仍然存在,我希望有人能解决它。为什么我必须声明所有不会出现在通用块中的令牌?如果词法分析器在 中遇到声明的 TOKEN genericBlock,则失败。OBR为什么我特别告诉它要匹配除and之外的任何其他内容CBR

于 2013-07-07T19:18:22.093 回答