Optimization antlr4:代码生成与访问者

Optimization antlr4:代码生成与访问者,optimization,antlr4,production,visitors,Optimization,Antlr4,Production,Visitors,我的语法包含生产代码。 真的有可能把这个和访客混在一起吗?(我的问题是实现if cond,然后阻塞endif) 就性能而言,语法上的生产代码与访问者之间是否存在差异?(我必须在Javascript目标浏览器中每秒重新评估几个程序30-60次。我知道直接生产代码更接近编译代码,但可能我错了)。因此,不存在随后与访问者一起遍历解析树的障碍 使用访问者(不使用嵌入的操作)可以实现相同的最终结果 使用访问者会产生一些开销-如果不进行测试,就无法判断它是否重要(使用Java/Antlr运行时,在相当长的源

我的语法包含生产代码。 真的有可能把这个和访客混在一起吗?(我的问题是实现if cond,然后阻塞endif)


就性能而言,语法上的生产代码与访问者之间是否存在差异?(我必须在Javascript目标浏览器中每秒重新评估几个程序30-60次。我知道直接生产代码更接近编译代码,但可能我错了)。因此,不存在随后与访问者一起遍历解析树的障碍

使用访问者(不使用嵌入的操作)可以实现相同的最终结果


使用访问者会产生一些开销-如果不进行测试,就无法判断它是否重要(使用Java/Antlr运行时,在相当长的源文本中使用多个walker评估相对复杂的语法,在温暖的环境中平均需要3毫秒-YMWV)。

生产代码是什么意思?当g4文件中直接有代码时,直接产生输出的操作。例如:E返回[float v]:a=E op=(“*”|“/”|+“|-”)b=E{$v=myeval($a.v,$op.type,$b.v);}max'('a=E,'b=E')”{$v=Math.max($a.v,$b.v);}……是的,这些操作的范围有限。但是现在我必须实现if/then/else。人们似乎告诉我,现在不可能这样做了(在早期版本的Antlr:-()。我应该使用访问者(我仍然不知道怎么做)。在这里,我想首先知道是否可以仅为if/then/else使用访问者,并保持其余的生产代码不变。简单的回答是可以的,您可以同时使用这两种技术。Antlr4倾向于在某些操作中使用Walker,例如if/then/else,但这决不排除或限制使用acti在我的旧Antlr2.7程序中,我试图用最少的工作来适应它,它只是通过以下方式获得:#(“if”cond=F:fexpr){if(cond!=0.0){if(F->getNextSibling())if(F->getNextSibling())if(F->getNextSibling())->getFirstChild())启动(F->getNextSibling()->getFirstChild());}否则如果(F->getNextSibling())如果(F->getNextSibling()->getNextSibling())启动(F->getNextSibling()->getNextSibling());}想象一下这是可能的,但您正在与Antlr4的优势作斗争。在尝试最小化工作时,您可能会制造一个实现和维护的噩梦。您所提出的实际上是将解析树的结构硬编码回语法中!这种脆弱性正是Antlr4努力避免的。您将节省更多的时间我是一名高级工程师和成年人。我知道我的项目,时间表,我有一些经验。我做仲裁和选择。编码风格的观点决不能变成绝对主义的宗教和意识形态:循环状态也存在。在这里,我试图制作一个旧代码(供用户使用)通过网络生存下来,几乎没有可用的资源来完成这项工作。这很复杂,几乎就在那里,但这一点很重要。我真的应该把整个事情都扔掉,还是修改其他专业项目的优先级,仅仅为了符合这一“理想”?理想应该是一种灵感,而不是刹车、墙或监狱