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