我正在为一个JavaScript AST实现一个漂亮的打印机,我想问一下是否有人知道一个"正确的"算法,根据运算符优先级和关联性自动用最小括号括起表达式.我没有在谷歌上找到任何有用的材料.
显而易见的是,父级具有更高优先级的运算符应该用括号括起来,例如:
(x + y) * z // x + y has lower precedence
Run Code Online (Sandbox Code Playgroud)
但是,也有一些运算符不是关联的,在这种情况下仍需要括号,例如:
x - (y - z) // both operators have the same precedence
Run Code Online (Sandbox Code Playgroud)
我想知道后一种情况的最佳规则是什么.对于除法和减法,是否足以说明,如果rhs子表达式的优先级小于或等于,则应将其括起来.
javascript compiler-construction pretty-print abstract-syntax-tree parentheses
我正在开发一个用JavaScript + HTML5编写的音乐编辑器/音序器应用程序,它将使用canvas元素和Chrome的Web Audio API(我已经有一个简单的原型工作).
我不太确定的一件事是如何为此实现GUI.它需要有许多不同的视图,我想将每个视图放在一个不同的可点击"选项卡"中,在给定时间前景中有一个选项卡,其他所有隐藏.我只是不确定如何实现所有这些选项卡.
将每个标签实现为不同的HTML图层并使用按钮控制哪个图层显示在顶部会更好吗?当按下标签按钮时,是否更好地(重新)生成HTML?
您的建议表示赞赏.
我想为我正在设计的编程语言编写一个解释器并跟踪JIT.我已经有很多年用C++编程的经验,但我一直想知道是否有更新的替代方案可能更好.在我的C++时代,我发现最令人沮丧的事情之一就是不得不使用头文件来处理笨重的单通道编译器模型.问题是并非所有语言都适用于此目的.对于我的跟踪JIT,我需要能够将可执行代码写入内存并让解释器调用该代码.我还需要生成的代码才能回调主机功能.
我开始看Go,看到该语言有指针,但没有指针算术.这立刻让我感到震惊.我可能想编写自己的分配器和垃圾收集器.我需要严密控制我的语言对象在内存中的布局方式,并能够获取特定字段的地址并写入它们.除非有办法解决这个问题,否则Go似乎不能达到我的目的.
D语似乎很有希望.它有指针算法和进出D调用所需的ABI的清晰轮廓.我听到很多关于它的好东西.它也有垃圾收集,这对编译器编写很好,但我仍然有一些我不确定的事情:
D是否有标准的库可以让我将内存块标记为可执行文件?
如果我分配了一大块内存,我想用自己的GC管理自己,并且有一堆指针进入那里,这会给D的垃圾收集器带来问题吗?
根据您的经验,D与C代码的互操作性如何?加载C动态库并调用它们相当容易吗?
最后,还有整个支持方面.对于那些在Linux上使用过D的人来说,工具链有多好?有什么问题?有没有人在D中编写JIT编译器,如果有,那么经验如何?
javascript ×2
c++ ×1
d ×1
go ×1
html ×1
html5 ×1
jit ×1
parentheses ×1
pretty-print ×1
tabs ×1