我正在为自己的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();
}
到目前为止,这就是我的做法,而且我知道我要一个人来解决我的问题,但是我对此一无所知,不知道如何进行。
任何帮助表示赞赏!
最佳答案
您不能仅将解析器用于任何格式设置任务,除非您希望解析器仅能与有效输入一起使用。格式化主要是重写空白,而词法分析器更适合于空白。有关如何实现代码格式化程序的示例,请参见我的ANTLR4 plugin for Visual Studio Code。这是针对ANTLR4语法的,但是相同的原理也适用于任何其他编程语言。