有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在为我自己的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) 个答案

  1. # 1 楼答案

    您不能仅将解析器用于任何格式化任务,除非您希望它只能处理有效的输入。格式化主要是重写空白,lexer更适合这种情况。有关如何实现代码格式化程序的示例,请参见myANTLR4 plugin for Visual Studio Code。这一条适用于ANTLR4语法,但同样的原则适用于任何其他编程语言