当前位置: 首页 > 知识库问答 >
问题:

如何在ANTLRs java运行时获得解析器规则的所有事件?

屠锐
2023-03-14

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

蒋培
2023-03-14

不能只使用解析器进行任何格式化任务,除非您希望它能够只处理有效的输入。格式化主要是重写空白空间,lexer更适合于此。有关如何实现代码格式化程序的示例,请参见我的用于Visual Studio代码的ANTLR4插件。这是针对ANTLR4语法的,但同样的原则也适用于任何其他编程语言。

 类似资料:
  • 问题内容: 我的.NET应用程序在运行时评估用户定义的规则。这些规则由用户通过GUI菜单输入到系统中。我生成一个与其对应的逻辑语句,并将其存储在数据库中。 例如:(名称=’John’AND姓氏=’Smith’)或数字> 12 但是,当用户想要通过GUI编辑规则时,我需要进行反向操作来从存储的规则中确定菜单状态,这既昂贵又复杂。您如何建议以一种可以轻松地反转到菜单状态的方式存储规则? 问题答案: 您

  • 我正在使用TopBraid免费版创建具有SPIN规则的OWL本体。我正在加载本体论和SPIN规则到芝麻OpenRDF工作台: 我创建了一个简单的测试本体。它有一个类,具有一个旋转规则和一个数据类型属性。 SPIN规则将时间戳添加到我的测试类的测试实例中。以下是整个测试本体的RDF,包括我的类、数据类型属性和规则(简称): 因此,清除我在芝麻中的SPIN存储库,并使用工作台的修改/添加命令(未选中“

  • CloudGate解析规则可以直接导入使用,不需要任何额外的操作,非常方便! 规则列表 规则名称 下载地址 Surge https://async.be/Rule/Basic/Hosts Shadowrocket https://async.be/Rule/Basic/Hosts 解析规则 简要概述:通过实时同步Hosts信息源达到自动更新,同时使用解析模板进行生成。 无需任何其他操作,导入即可使

  • template.defaults.rules art-template 可以自定义模板解析规则,默认配置了原始语法与标准语法。 修改界定符 // 原始语法的界定符规则 template.defaults.rules[0].test = /<%(#?)((?:==|=#|[=-])?)[ \t]*([\w\W]*?)[ \t]*(-?)%>/; // 标准语法的界定符规则 template.def

  • 我正在开始一个项目,流口水和口水guvnor。 我的规则部署在drools Guvnor中。我的规则引擎实例可以通过drools Guvnor公开的pkg文件访问这些规则,当您进行包发布、构建和发布时。 这一切都很好,我正在寻找的是在运行时禁用规则的解决方案。 我现在唯一的解决方案是去guvnor,归档规则,并对包含该规则的包进行构建+发布。 不是还有别的策略吗?

  • 问题内容: 我有这张桌子: 如何为每个名称获得年份第二高的行,如下所示: 我尝试了以下查询,但没有成功: 上一个查询给了我这个错误:“ SQL错误(1235):此版本的MySQL尚不支持’LIMIT&IN / ALL / ANY / SOME子查询’” 而且我现在无法更改MySQL版本(5.6.25),因为该解决方案已经投入生产。 有什么帮助吗? 问题答案: 在MySQL中,每个组求解n的一种方法