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

标签 java antlr antlr4

我正在使用 Java 编写我自己的 ANTLR 语法的代码格式化程序,现在想要格式化一个特殊规则。

我想要的是以某种方式迭代我的解析器规则之一的所有出现(具体来说是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();
}

这就是我到目前为止的情况,我知道我正在要求有人来解决我的问题,但我被困在这个问题上,不知道如何继续。

任何帮助将不胜感激!

最佳答案

您不能仅使用解析器来执行任何格式化任务,除非您希望它只能使用有效的输入。格式化主要是重写空格,词法分析器更适合于此。看我的ANTLR4 plugin for Visual Studio Code有关如何实现代码格式化程序的示例。这是针对 ANTLR4 语法的,但同样的原则也适用于任何其他编程语言。

关于java - 如何获取 ANTLRs java 运行时中所有出现的解析器规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56788148/

相关文章:

java - 包结构中的非java文件

java - 将字符串转换为 Set<String>

java - 我的程序出现错误

java - Gradle srcDirs 路径

java - ANTLR 帮助 - 无法解析普通文本,但所有其他更复杂的规则都可以工作

使用 antlr 和 line 指令的 C++ 代码插入

eclipse - Maven仅在默认包中生成Antlr源

java - X的辅助类在不同的java项目之间共享,每个项目使用不同版本的X

java - 在简单的整数列表语法中使用 AntLR4 中的访问者

java - 从 ANTLR AST 识别 Java 变量