在学校里,我们被分配设计一种语言,然后实现它,(我在实现它=时玩得很开心)。我的老师告诉我们要使用yacc/lex,但是我决定使用java + regex,下面是我设计的语言:
Program "my program"
var yourName = read()
if { equals("guy1" to yourName) }
print("hello my friend")
else
print("hello extranger")
end
Program End嗯,如你所见,这是一种相当基本的语言=)。
我想我可以用一种非常面向对象的方式来实现它,比如创建一个抽象类Sentence,然后有像VariableAssignment、IfSentence等子类,并且有一个类Program,它只是一堆句子,对吗?然后在所有的eval上调用一个抽象方法Sentence,因此,我对该语言的初步理解只包括两个阶段:
当然,如果任何第二阶段出了问题,都会引起错误。
我的问题是,我做错了吗?我是否应该像理论上所说的那样,研究所有的阶段(词汇,句法,语义)?我应该继续我天真的两阶段编译器吗?
发布于 2009-11-11 15:50:03
我不会问一个显而易见的问题,为什么你不听从导师的建议,使用yacc/lex,因为我知道答案。你想去做一些你认为很酷的事情,并帮助你学习。不幸的是,这种方法是由您的教授推荐的,因为正如另一篇文章所述,在您探索多种方法并花费大量时间试图找到一个好的解决方案之前,许多非常聪明的人。
您可以使一个两阶段编译器工作,但您需要接受这样一个事实,即它永远不会像完成整个过程那样好,因为它很难检测错误。事实上要难得多。在某些情况下,直到为时已晚,您才能判断出存在错误。ie:已经编译好了,并试图运行。
如果你想更多地了解它,那么就采用两阶段的方法,你会遇到和你遇到的人一样的问题。请一定要明白,最终解决方案需要花费很长的时间,您可能会在项目中遇到停靠点,而且它可能无法正常工作。
尽管如此,你会比班上的任何人都了解更多。如果你有空闲的时间,我会用你现在的方式来做。这些知识可能会派上用场。我也会和你的教授谈谈,告诉他你会用另一种方式来反对他的建议,因为你想要有一个更彻底的理解。也许他不会因为你的计划野心勃勃而放弃分数,即使结果是错误的。
毕竟,在大学里做项目的目的是学习。
发布于 2009-11-11 15:41:17
很多聪明人都这么想,从你的帖子里,他们得出结论,所有的阶段都是必要的。
所以,如果你想让你的编译器工作,按照理论的规定去做。
如果你想要理解,为什么它决定了阶段,试试捷径。可能要花更长的时间。
免责声明:我对编译器理论一无所知。
另一个注意事项:您有一个问题;您决定使用regexp解决它;现在您有两个问题。
发布于 2009-11-11 15:51:29
如果使用regexes解析每一行,则语言的语法将非常有限。
如果语法变得更加复杂,您将无法仅使用正则表达式API解析每一行。如果开始添加和以及或运算符,甚至连正则表达式也不可能解析,如果您开始在字符串中支持\n这样的转义字符,会发生什么?
可以帮助您使用词法分析器,但是您必须从那里编写解析器。您可以采取以下几种方法之一:
除其他外
(此外,“语句”是“句子”的同义词,在编译器文本中更为常见)
https://stackoverflow.com/questions/1715984
复制相似问题