我想通过在后台以编程方式添加一些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 回答
ANTLR 4默认生成一个监听器接口和基类(空实现) . 如果在生成解析器时也指定了
-visitor
标志,它将创建一个访问者接口和基类 . 这些特征中的任何一个都可以用于使用解析树执行代码,而不是直接在语法文件中嵌入动作 .如果代码总是在同一个地方,只需插入一个函数调用作为一个钩子,然后包含实际代码 . 这样您就不必修改源或再次生成词法分析器/解析器 .
如果要在预定义的点插入代码(例如输入规则/离开规则),请使用Sam的解决方案将它们插入到侦听器中 . 在任何一种情况下,都不需要修改语法文件 .
在您选择的java文件中(我不是Java程序员,所以真正的语法可能不同):