1

我正在用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

我在这里想念什么?

4

0 回答 0