我想通过在后台以编程方式添加一些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访客)一个简单的语法?
答案 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");
}
}