2009-09-29 71 views
0

编译器设计中的换行符和空格是否相同?如果你写一个宏来用空格替换换行符,这是正确的还是会导致某种形式的问题呢?编译器设计

回答

4

取决于语言。目前和现在都有各种处理空白的方式。 (我不是在引用字符串或类似的东西中讨论空格,只是编写语句。)

在C和C++中,预处理器指令以换行符结束,但除空格外是空格。

在老式的FORTRAN中,一个声明必须在特定的列(7-72)中,并且卡的结尾将结束一个声明,除非在下一张卡的第6列中有一个连续字符,但第7-72栏中的空格是完全可选的。这使解析变得困难,因为DO 10 I = 1, 10是一个循环语句,而DO 10 I = 1. 10是将值1.1赋值给变量DO10I

同样,在我第一台家用计算机中使用的BASIC中,换行符是唯一重要的空间,需要换行号和语句。

在Python中,whitespace用于结束语句,也用于定义语句分组。

在很多语言中,空格的性质不重要,但是必须在语言标记之间留有空格,而不是在空格内。因此,答案是“它取决于”,并且没有编译器理论的基本原则(除了要求使用空格大大简化了词法分析)。

1

您必须区分重要的空白(例如内部引号)和命令或语句之间不相关的空白。

+1

我猜可以假定他的意思是不相关的空白 – 2009-09-29 18:58:57

9

取决于语言。例如,这对Python不起作用。

+0

*只*正确答案! – 2009-09-29 18:59:15

0

这实际上取决于语言的语法。如果语言本身对这类字符(认为Python)敏感,那么替换会导致问题。如果不是,我不会预见到任何问题。在大多数情况下,你可以去除空白(字符串之外)。

4

这取决于语言的语法。某些语言(例如Python)使用换行符作为语句终止符。并且有几种语言对代码布局非常敏感(例如,Haskell,尽管它也允许非布局语法)。

2

空格的重要性完全取决于语法。请参阅以下编程语言:Whitespace

这是一种非常愚蠢的语言,但它很重要。

+0

+1提及空格:) – 2009-09-29 19:07:10

1

不。有些语言(VB)认为换行符是语句终结符。所有语言都会跟踪换行符以报告错误和警告的行号,但您可以将此视为扫描仪(词法分析器)的单独任务,而不是编译器。

+0

同意。这是由词法分析器处理的,取决于语言。 – 2009-09-29 19:06:58

0

某些语言不关心换行符,直到它们碰到通常是​​3210,而其他语句确实在换行符处结束语句,并且通常具有连续字符,通常为'\'

有几个是介于两者之间的,最值得注意的是Ruby。在Ruby中,换行符通常会结束语句,但解析器通常可以确定是否需要读取更多行。以二进制运算符结尾的行,打开parens和其他类似的东西不会终止语句。

而且我们也应该提到Python,它具有通过缩进级别表示块分隔符的非常酷的属性。

0

空格和换行符与编译器的词法分析器确实不同。

当然,它是否忽略它们或将它们转换为标记取决于您的语言的语法。

0

我认为这个问题现在已经得到了很好的回答,但是我想补充一点,单独处理换行符是有价值的,这样你就有了跟踪行号的方法,人们通常会在错误输出中期望行号。一些词法分析器可能会为你做这件事,但有些不会。除此之外,它确实取决于所涉及的语言是否需要有任何特别的区别。

0

如果您在设计编程语言,您不仅应该使用空格来分隔令牌,还要提高其中编写的程序的可读性。