我正在用java编写多行字符串(文本块)的语法。文本块的开始和结束的分隔符是三引号。我可以成功地解析和构建文本块及其内容的 AST,除了一个问题:TEXT_BLOCK_START
令牌是在第二个词法分析器的令牌之后返回的。我以此为指导:流程图。根据 ANTLR2 文档,我实现它的方式应该产生所需的令牌流:
TEXT_BLOCK_START
-> content from second lexer, etc...
->TEXT_BLOCK_END
我尝试更改操作和分隔符的顺序、规则的顺序以及使用select()
而不是selector.push()
.
以下是主类的重要部分:
final Lexer lexer = new Lexer(reader);
lexer.setCommentListener(contents);
final Lexer secondLexer =
new Lexer(lexer.getInputState());
lexer.setTokenObjectClass("antlr.CommonHiddenStreamToken");
secondLexer.setTokenObjectClass("antlr.CommonHiddenStreamToken");
final TokenStreamHiddenTokenFilter filter = new
TokenStreamHiddenTokenFilter(lexer);
final TokenStreamSelector selector = new TokenStreamSelector();
lexer.selector = selector;
secondLexer.selector = selector;
selector.addInputStream(filter, "filter");
selector.addInputStream(secondLexer, "secondLexer");
selector.select(filter);
词法分析器(主词法分析器)规则:
TEXT_BLOCK_START
: "\"\"\"" {selector.push("secondLexer");}
;
二级词法分析器规则:
TEXT_BLOCK_END
: "\"\"\"" {selector.pop();}
;
如上所述,一切都按预期解析,除了令牌流如下所示:
content from second lexer, etc...
-> TEXT_BLOCK_END
->TEXT_BLOCK_START
我在这里想念什么?