在后台修改纯ANTLR文件

时间:2014-09-13 12:07:04

标签: java parsing antlr antlr4

我想通过在后台以编程方式添加一些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 :(得分:3)

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

答案 1 :(得分:0)

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

如果要在预定义的点插入代码(例如输入规则/离开规则),请使用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");
    }
}