基于g的上下文敏感代码生成

2024-06-16 12:10:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在的情况是,我用grako的modelbuilder语义构建了一个抽象语法树(abstractsyntax tree,AST)。现在我需要从AST生成javascript代码。我已经定义了几个模板,但是我意识到不是所有的案例都可以用简单的模板来处理。我坚持的具体规则是:

fcall::FunctionCall   = name:identifier '(' ','.{args:expression} ')' ;

这个规则同时匹配简单函数调用和构造函数调用,因为无法从词汇上确定哪个是哪个,这取决于是否在该范围内定义了具有该名称的类

例如“a=Func();”

在javascript中,这两种情况需要不同的语法(“a=new Func();”或“a=Func();”)

所以我需要一个符号表来跟踪哪个是哪个。有没有办法和格拉科一起做到这一点

其他信息:

我的想法是: 创建一个walker类,它构建一个符号表,当它处理一个FunctionCall对象时,检查它是否是一个构造函数调用,在这种情况下,用一个ConstructorCall节点替换FunctionCall节点。然后简单地为这两个模板创建两个模板

我不喜欢这种方法的地方是,它感觉太分离了,每个模板都需要一个新类


Tags: 模板节点定义规则语义语法情况javascript
1条回答
网友
1楼 · 发布于 2024-06-16 12:10:23

可以在运行时更改模板和渲染字段。因为ModelRenderer的实例是为每个AST节点创建的,所以所做的更改只会影响单个Node的呈现:

def render_fields(self, fields):
   if self.is_constructor_call():
      self.template = self.constructor_template

注意,赋值是给实例变量的,ClassName.template保持不变

相关问题 更多 >