Compiler construction 编译程序设计

Compiler construction 编译程序设计,compiler-construction,syntax,whitespace,Compiler Construction,Syntax,Whitespace,在编译器设计中,换行符和空格是否相同?如果您编写一个宏以空格替换换行符,这是正确的还是会导致某种形式的问题?您必须区分重要的空格(如引号内的空格)和命令或语句之间不相关的空格。取决于语言。例如,这对Python不起作用。这实际上取决于语言的语法。如果语言本身对这类字符很敏感(比如Python),那么替换会导致问题。如果不是的话,我预计不会有任何问题。在大多数情况下,您可以去除空白(字符串之外)。这取决于语言的语法。有些语言(例如Python)使用换行符作为语句终止符。很少有语言对代码布局非常敏感

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

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

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

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

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

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


<>这是一个非常愚蠢的语言,但它是一个很好的观点。

< P>不。有些语言(VB)认为新行是一个声明终止符。所有语言都会跟踪新行来报告错误和警告的行号,尽管您可以认为这是扫描仪(LoxER)的独立任务,而不是编译器。

< P>取决于语言。处理空白的方式有很多种,过去也有很多种。(我不是在谈论带引号的字符串中的空格或诸如此类的内容,只是在编语句。)

<>在C和C++中,预处理器指令以换行符结束,但空白处除了空白之外。

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

类似地,在我第一台家用电脑使用的BASIC中,换行是唯一有效的空间,这需要一个新的行号和语句

在Python中,空格用于结束语句,还用于定义语句分组

在许多语言中,空格的性质无关紧要,但在语言标记之间必须有空格,而不是在它们内部


因此,答案是“视情况而定”,并且没有编译器理论的基本原则(除了要求使用空格可以极大地简化词法分析)。

有些语言不关心换行符,而是一直阅读,直到它们碰到一个
“;”,而其他语句则在换行符处急剧结束语句,并且通常有一个连续字符,通常是
'\'

有一些介于两者之间,最著名的是Ruby。在Ruby中,换行符通常结束语句,但解析器通常可以确定是否需要读取更多行。以二进制运算符、打开参数结尾的行以及其他类似的内容不会终止语句


我们可能还应该提到Python,它具有通过缩进级别表示块分隔符的非常酷的特性。

对于编译器的词法分析器来说,空格和换行肯定是不同的


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

我认为这一点现在已经得到了很好的回答,但是我想补充一点,单独处理换行符是有价值的,这样您就可以跟踪行号,这是人们通常期望的错误输出。有些lexer生成器可能会为您执行此操作,但有些不会。除此之外,它实际上取决于所讨论的语言是否需要有任何特殊的区别。

如果您正在设计编程语言,那么您应该使用空格,而不仅仅是分隔标记,但也要提高用它编写的程序的可读性。

我想可以假定他指的是不相关的空格。这需要词法分析人员处理,取决于语言。