首页 文章

在后台修改普通的ANLTR文件

提问于
浏览
0

我想通过在后台以编程方式添加一些Java代码来修改语法文件 . 我的意思是考虑你有一个println语句,你想在ANTLR工作之前将它添加到语法中(即创建词法分析器和解析器文件) .

我有这个简单的代码: {System.out.println("print");}

这是我想在'expr'之后的'prog'规则中添加上述片段的简单语法:之前:

grammar Expr;       
prog:   (expr NEWLINE)* ;
expr:   expr ('*'|'/') expr        
    |   INT
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;

后:

grammar Expr;       
prog:   (expr {System.out.println("print");} NEWLINE)* ;
expr:   expr ('*'|'/') expr 
    |   INT       
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;

再次注意,我想在运行时执行此操作,以便语法不显示任何Java代码('之前'代码段) .

在ANLTR生成词法分析器和解析器文件之前,是否可以使其成为现实?有没有办法访问(像ANTLR的AST访客)一个简单的语法?

2 回答

  • 0

    ANTLR 4默认生成一个监听器接口和基类(空实现) . 如果在生成解析器时也指定了 -visitor 标志,它将创建一个访问者接口和基类 . 这些特征中的任何一个都可以用于使用解析树执行代码,而不是直接在语法文件中嵌入动作 .

  • 3

    如果代码总是在同一个地方,只需插入一个函数调用作为一个钩子,然后包含实际代码 . 这样您就不必修改源或再次生成词法分析器/解析器 .

    如果要在预定义的点插入代码(例如输入规则/离开规则),请使用Sam的解决方案将它们插入到侦听器中 . 在任何一种情况下,都不需要修改语法文件 .

    grammar Expr;       
    prog:   (expr {Hooks.programHook();} NEWLINE)* ;
    expr:   expr ('*'|'/') expr 
        |   INT       
        ;
    NEWLINE : [\r\n]+ ;
    INT     : [0-9]+ ;
    

    在您选择的java文件中(我不是Java程序员,所以真正的语法可能不同):

    public class Hooks
    {
        public static void programHook()
        {
           System.out.println("print");
        }
    }
    

相关问题