我的情况是,我使用 grako 的模型构建器语义构建了一个抽象语法树 (AST)。现在我需要从那个 AST 生成 javascript 代码。我已经定义了几个模板,但我意识到并不是所有的情况都可以用简单的模板来处理。我坚持的具体规则是:
fcall::FunctionCall = name:identifier '(' ','.{args:expression} ')' ;
此规则匹配简单的函数调用和构造函数调用,因为无法从词法上确定哪个是哪个,这取决于是否在该范围内定义了具有该名称的类。
所以例如“a = Func();”
在 javascript 中,这两种情况需要不同的语法(“a = new Func();”或“a = Func();”)
所以我需要一个符号表来跟踪哪个是哪个。有没有办法用 grako 实现这一目标?
附加信息:
我如何做到这一点的想法:创建一个walker类,它建立一个符号表,当它处理一个FunctionCall对象时,检查它是否真的是一个构造函数调用,在这种情况下,用一个ConstructorCall节点替换FunctionCall节点。然后只需为两者提供两个模板。
我不喜欢这种方法的地方是它感觉太分离了,并且每个模板都需要一个新类。