首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用grako生成上下文感知代码

用grako生成上下文感知代码
EN

Stack Overflow用户
提问于 2016-12-04 11:37:07
回答 1查看 50关注 0票数 0

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

代码语言:javascript
复制
fcall::FunctionCall   = name:identifier '(' ','.{args:expression} ')' ;

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

例如"a = Func();“

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

所以我需要一个符号表来跟踪哪一个。有办法用grako来完成这个任务吗?

附加信息:

我关于如何做到这一点的想法:创建一个walker类,它构建一个符号表,当它处理一个FunctionCall对象时,检查它是否实际上是一个构造函数调用,在这种情况下用一个ConstructorCall节点替换FunctionCall节点。然后,只需为这两个模板提供两个模板。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-05 11:30:56

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

代码语言:javascript
复制
def render_fields(self, fields):
   if self.is_constructor_call():
      self.template = self.constructor_template

注意,分配给一个实例变量,并且ClassName.template保持不变。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40958190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档