Har*_*555 1 java code-analysis compiler-theory
在学校,我们被分配设计一种语言,然后实施它,(我实现它很有趣=)).我的老师告诉我们使用yacc/lex,但我决定使用java + regex API,这就是我设计的语言的样子:
Program "my program"
var yourName = read()
if { equals("guy1" to yourName) }
print("hello my friend")
else
print("hello extranger")
end
Program End
Run Code Online (Sandbox Code Playgroud)
好吧,正如你所看到的,它是一种非常基本的语言=).
我以为我可以以一种非常OOP的方式实现它,比如创建一个抽象类Sentence然后有子类等VariableAssignment,IfSentence并且有一个Program只有一堆句子的类吧?然后eval在所有Sentences 上调用一个抽象方法,所以我最初编译语言的方法只包括两个阶段:
当然,如果在任何阶段出现问题,Ii都可能引发错误.
我的问题是,我做错了吗?我应该像理论一样(词汇,句法,语义)来讨论所有阶段吗?我应该继续使用我天真的两阶段编译器吗?
很多聪明的人都想到了这一点,从我的帖子中,他们得出的结论是所有阶段都是必需的.
因此,如果您希望编译器工作,请按照理论的指示.
如果你想了解,为什么它决定了阶段,试试捷径.这可能需要更长的时间.
免责声明:我不知道编译器理论
另一个说明:你有问题; 你决定用regexp来解决它; 现在你有两个问题
我不会问一个明显的问题,为什么你不遵循你的导师的建议并使用yacc/lex,因为我知道答案.你想去做一些你认为很酷的事情并且会帮助你学习.不幸的是,这种方法是由你的教授推荐的,因为正如另一篇文章所说,在你探索多种方法并花费大量时间试图找到一个好的解决方案之前,很多非常聪明的人.
您可以使两阶段编译器工作,但您需要接受它将永远不会像完成整个过程一样好,因为它更难以检测错误.实际上要困难得多.在某些情况下,你甚至不能告诉它有错误,直到为时已晚.即:已编译并尝试运行.
如果你想要了解更多关于它的知识,那么采用两阶段方法,你将遇到与你遇到之前相同的问题.请务必明白,要获得最终解决方案需要花费更长的时间,您可能会在项目中停靠点,并且可能无法正常工作.
也就是说,你将比同班同学更多地了解它.如果你有空的时间,我会按你现在的方式做.这些知识可能会派上用场.我也会和你的教授谈谈,并告诉他你将采取另一种方式反对他的建议,因为你想要有更透彻的理解.也许他不会因为雄心勃勃而从你的项目中剔除分数,即使事实证明是错误的.
毕竟,在大学里做项目的重点是学习.
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |