1

在学校里,我们被分配设计一种语言,然后去实现它,(我在实现它时玩得很开心=))。我的老师告诉我们使用 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

好吧,正如你所看到的,它是一种非常基本的语言 =)。

我以为我可以以非常 OOP 的方式实现它,比如创建一个抽象类Sentence,然后有子类VariableAssignmentIfSentence等等,并且有一个Program只有一堆句子的类,对吗?eval然后在所有s 上调用一个抽象方法Sentence,所以我最初编译语言的方法只包括两个阶段:

  1. 识别每行的语法
  2. 为每一行创建对应的类

当然,如果任何阶段 Ii 出现问题,都可能引发错误。

我的问题是,我做错了吗?我应该像理论所说的那样遍历所有阶段(词汇、句法、语义)吗?我应该继续使用我幼稚的两阶段编译器吗?

4

5 回答 5

5

很多聪明人都考虑过这一点,从我的帖子中,他们得出的结论是所有阶段都是必要的。

因此,如果您希望编译器正常工作,请按照理论规定的方式进行。

如果您想了解为什么它决定阶段,请尝试捷径。这可能需要更长的时间。


免责声明:我对编译器理论一无所知


另注:你有问题;您决定使用正则表达式解决它;现在你有两个问题

于 2009-11-11T15:41:17.357 回答
5

我不会问你为什么不听从导师的建议并使用 yacc/lex 的明显问题,因为我知道答案。你想出去做一些你认为很酷并且可以帮助你学习的事情。不幸的是,你的教授推荐了这种方法,因为正如另一篇帖子所说,在你探索多种方法并花费大量时间试图找到一个好的解决方案之前,有很多非常聪明的人。

您可以使两阶段编译器工作,但您需要接受它永远不会像完成整个过程那样好,因为它更难检测错误。事实上要难得多。在某些情况下,您甚至无法判断存在错误,直到为时已晚。即:已经编译并尝试运行。

如果您想了解更多有关它的信息,请使用两阶段方法,您将遇到与您之前遇到的人相同的问题。请务必了解,获得最终解决方案将花费您更长的时间,您可能会在项目中遇到问题,并且可能无法正常工作。

也就是说,您将比班上其他任何人了解更多有关它的信息。如果你有时间,我会按照你现在的方式去做。这些知识将来可能会派上用场。我也会和你的教授谈谈,告诉他你会用另一种方式来反对他的建议,因为你想有一个更彻底的理解。也许他不会因为你的雄心勃勃而从你的项目中扣分,即使结果是错误的。

毕竟,在大学里做项目的目的是为了学习。

于 2009-11-11T15:50:03.967 回答
1

如果您使用正则表达式解析每一行,您的语言将具有非常有限的语法。

如果您的语法变得更复杂,您将无法仅使用正则表达式 API 解析每一行。如果您开始添加ANDOR运算符,即使if { equals("guy1" to yourName) }使用正则表达式也无法解析,如果您开始支持字符串文字中的转义字符,会发生什么情况?\n

Java Regex API 可以帮助您使用词法分析器,但您必须从那里编写解析器。您可以采取以下几种方法之一:

  • 如果您使用的是 Java,您可以查看Antlr(它不需要使用 Java 的正则表达式库编写词法分析器),或者
  • You could write a recursive descent parser by hand

among others

(also, "Statement" is a synonym for "Sentence" that is more common in compiler texts)

于 2009-11-11T15:51:29.037 回答
1

If you want to use only regular expressions to parse your language, your language can only be regular. This is a big constriction, for example, arbitrarily deep nesting would be impossible, as you would have to teach your parser each nesting combination separately. I am not sure if building a Turing-complete regular language is even possible.

于 2009-11-11T16:32:38.877 回答
0

If u really want to dirty ur hands code a recursive descent parser. If you want to understand compiler theory use antlr and concentrate on the principles leaving the implementation for the parser generator. BTW, why would wnat to complicate your life with regex?!

于 2009-11-11T16:16:21.670 回答