如何在ANTLRs Java运行时中获得所有解析器规则的出现?

时间:2019-06-27 09:36:23

标签: java antlr antlr4

我正在为自己的 ANTLR 语法在Java中使用代码格式化程序,现在想对一种特殊规则进行格式化。

我想要的是以某种方式迭代我的解析器规则(具体为if_stmt)之一的所有出现次数。 我正在使用ANTLR4和Java运行时。


这是我针对此问题的语法的最小版本:

stmt_block
:
    EOF
    | stmt_list EOF
;

stmt_list
:
    stmt
    | stmt_list stmt
;

stmt
:

    if_stmt
    |  RETURN SEMICOLON NEWLINE?
;

if_stmt
:
    IF BRACKET_OPEN expr BRACKET_CLOSED CBRACKET_OPEN stmt_list CBRACKET_CLOSED
;

expr
:
    TRUE
;

这是到目前为止我的格式化功能的样子

private String formatCode(String input) 
{
    // Parse the input
    MyLexer lex = new MyLexer(new CaseChangingCharStream(
        CharStreams.fromString(input), true));

    CommonTokenStream tokens = new CommonTokenStream(lex);
    tokens.fill();
    MyParser pars = new MyParser(tokens);
    Stmt_blockContext stmt_blockContext = pars.stmt_block();

    stmt_blockContext.children.forEach(parseTree->{
        //Iterate over the parseTree to get all if_stmtContext's and modify them
    });


    // Then return the modified contexts text
    return stmt_blockContext.getText();
}

到目前为止,这是我的工作方式,我知道我要一个人来解决我的问题,但是我对此一无所知,不知道如何进行。

任何帮助表示感谢!

1 个答案:

答案 0 :(得分:1)

您不能仅将解析器用于任何格式设置任务,除非您希望解析器仅能与有效输入一起使用。格式化主要是重写空白,而词法分析器更适合于空白。有关如何实现代码格式化程序的示例,请参见我的ANTLR4 plugin for Visual Studio Code。这是针对ANTLR4语法的,但是相同的原理也适用于任何其他编程语言。