如何最好地使用带有ANTLR4的侦听器,而不让代码变得混乱?

如何最好地使用带有ANTLR4的侦听器,而不让代码变得混乱?,antlr4,Antlr4,我使用Antlr4解析语法,并使用侦听器生成字节码。当我实现第一组IF-ELSE-ENDIF指令时,事情开始变得有点复杂,因为我必须确保维护上下文信息堆栈来处理嵌套的ID语句及其作用域之类的事情 现在,我准备处理一个IF中组合的多个条件,一旦遇到一个计算结果为false的条件,我就停止计算。问题是我注意到我的代码变得越来越复杂和难以理解。我几乎记不住它的本来面目,我会同情任何人看着它。这是因为我发现我必须在父节点上设置标志和上下文信息,以便让子节点知道如何处理它们从计算中产生的结果 我想到了一些

我使用Antlr4解析语法,并使用侦听器生成字节码。当我实现第一组IF-ELSE-ENDIF指令时,事情开始变得有点复杂,因为我必须确保维护上下文信息堆栈来处理嵌套的ID语句及其作用域之类的事情

现在,我准备处理一个IF中组合的多个条件,一旦遇到一个计算结果为false的条件,我就停止计算。问题是我注意到我的代码变得越来越复杂和难以理解。我几乎记不住它的本来面目,我会同情任何人看着它。这是因为我发现我必须在父节点上设置标志和上下文信息,以便让子节点知道如何处理它们从计算中产生的结果

我想到了一些可以简化事情的可能性:

1) 使用监听器只需构建一个自定义的树,其中包含我需要的重要信息,这样我就可以在树上来回走动。遍历这样一棵树会使我的代码不那么凌乱,因为我保存在树节点中的上下文信息将替换我当前保存在所有堆栈和结构中的信息

2) 创建多个侦听器,每个侦听器具有特定的焦点;i、 e、IF和ELSE附件中的代码块、多条件求值等。其思想是,当我遍历主侦听器时,我用我的代码输入调用一个专业侦听器(例如,IF块中的所有内容),然后在我继续生成指令时返回我可以使用的信息

3) 回顾一下我是如何做事的——也许事情很混乱,因为我用错了听众。见鬼,也许我需要用访客来代替


我意识到我可以用行动解决其中一些问题。如果没有其他选择,我可能会求助于此,但如果可能的话,我会尽量避免。

如果你的语言目的、语法和代码都不清楚,很难说该怎么办。我怀疑你是用听者直接解释你的语言。这是可能的,但通常访问者/听者被用来将语言转换成更容易解释的中间语言。如果既不知道语言的目的,也不知道语法和代码,很难说该怎么做。我怀疑你是用听者直接解释你的语言。这是可能的,但通常访问者/听者被用来将语言转换成更容易解释的中间语言。