我正在为学校项目创建一个简单的编程语言 . 我正在使用ANTLR 4从我的语法生成词法分析器和解析器 . 到目前为止,我一直在使用ANTLRs监听器模式来应用编程语言的实际功能 .
现在我想实现if / else语句,但是我不确定在使用监听器模式时这些实际上是可以实现的,因为ANTLR决定在使用监听器时遍历解析树的顺序,我想是if /的实现else语句将要求在解析树周围跳转,具体取决于语句中的条件是否满足 .
任何人都可以告诉我是否可以使用ANTLR实现if / else语句,或者我是否必须自己实现访问者模式?另外,任何人都可以给出一个非常简单的实现语句的例子吗?
1 回答
默认情况下,ANTLR 4会生成侦听器 . 但是如果你给命令行参数
-visitor
org.antlr.v4.Tool
,ANTLR会为你生成访问者类 . 这些工作与听众非常相似,但可以让您更好地控制走路/访问哪些(子)树 . 如果要排除某些(子)树(如else / if块,如您的情况),这将特别有用 . 虽然这可以使用侦听器来完成,但它需要引入全局变量来跟踪是否需要评估(子)树,哪些不需要 .碰巧的是,我还没有完成,但是我将发布一个小的工作示例,演示如何使用这些访问者类和
if
语句构造 .1.语法
这是一个支持基本表达式的简单语法,
if
- ,while
- 和log
-statements:Mu.g4
现在让我们假设您要解析并评估输入,如下所示:
test.mu
2.访客我
首先生成解析器和访问者类:
上面的命令会生成文件
MuBaseVisitor<T>
. 这是我们将用自己的逻辑扩展的类:EvalVisitor.java
其中
Value
只是我们任何语言类型的包装器(String
,Boolean
,Double
):Value.java
3.测试我
要测试类,请使用以下
Main
类:Main.java
并编译并运行源文件:
(在Windows上,最后一个命令是:
java -cp .;antlr-4.0-complete.jar Main
)运行
Main
后,没有任何反应(当然?) . 这是因为我们没有在EvalVisitor
类中实现任何规则 . 为了能够正确评估文件test.mu
,我们需要为以下规则提供适当的实现:if_stat
andExpr
orExpr
plusExpr
assignment
idAtom
booleanAtom
stringAtom
log
4.访客II和测试II
以下是这些规则的实现:
当您重新编译并运行
Main
时,以下内容将打印到您的控制台:有关所有其他规则的实现,请参阅:https://github.com/bkiers/Mu
编辑
来自@pwwpche,在评论中: