编译器设计中的换行符和空格是否相同?如果你写一个宏来用空格替换换行符,这是正确的还是会导致某种形式的问题呢?编译器设计
编译器设计
回答
取决于语言。目前和现在都有各种处理空白的方式。 (我不是在引用字符串或类似的东西中讨论空格,只是编写语句。)
在C和C++中,预处理器指令以换行符结束,但除空格外是空格。
在老式的FORTRAN中,一个声明必须在特定的列(7-72)中,并且卡的结尾将结束一个声明,除非在下一张卡的第6列中有一个连续字符,但第7-72栏中的空格是完全可选的。这使解析变得困难,因为DO 10 I = 1, 10
是一个循环语句,而DO 10 I = 1. 10
是将值1.1赋值给变量DO10I
。
同样,在我第一台家用计算机中使用的BASIC中,换行符是唯一重要的空间,需要换行号和语句。
在Python中,whitespace用于结束语句,也用于定义语句分组。
在很多语言中,空格的性质不重要,但是必须在语言标记之间留有空格,而不是在空格内。因此,答案是“它取决于”,并且没有编译器理论的基本原则(除了要求使用空格大大简化了词法分析)。
您必须区分重要的空白(例如内部引号)和命令或语句之间不相关的空白。
取决于语言。例如,这对Python不起作用。
*只*正确答案! – 2009-09-29 18:59:15
这实际上取决于语言的语法。如果语言本身对这类字符(认为Python)敏感,那么替换会导致问题。如果不是,我不会预见到任何问题。在大多数情况下,你可以去除空白(字符串之外)。
这取决于语言的语法。某些语言(例如Python)使用换行符作为语句终止符。并且有几种语言对代码布局非常敏感(例如,Haskell,尽管它也允许非布局语法)。
不。有些语言(VB)认为换行符是语句终结符。所有语言都会跟踪换行符以报告错误和警告的行号,但您可以将此视为扫描仪(词法分析器)的单独任务,而不是编译器。
同意。这是由词法分析器处理的,取决于语言。 – 2009-09-29 19:06:58
某些语言不关心换行符,直到它们碰到通常是3210,而其他语句确实在换行符处结束语句,并且通常具有连续字符,通常为'\'
。
有几个是介于两者之间的,最值得注意的是Ruby。在Ruby中,换行符通常会结束语句,但解析器通常可以确定是否需要读取更多行。以二进制运算符结尾的行,打开parens和其他类似的东西不会终止语句。
而且我们也应该提到Python,它具有通过缩进级别表示块分隔符的非常酷的属性。
空格和换行符与编译器的词法分析器确实不同。
当然,它是否忽略它们或将它们转换为标记取决于您的语言的语法。
我认为这个问题现在已经得到了很好的回答,但是我想补充一点,单独处理换行符是有价值的,这样你就有了跟踪行号的方法,人们通常会在错误输出中期望行号。一些词法分析器可能会为你做这件事,但有些不会。除此之外,它确实取决于所涉及的语言是否需要有任何特别的区别。
如果您在设计编程语言,您不仅应该使用空格来分隔令牌,还要提高其中编写的程序的可读性。
- 1. 编译器设计
- 2. 编译器设计资源
- 3. 柯里和编译器设计
- 4. 编译器设计和施工课
- 5. 计时器编译问题
- 6. 编译器假设对象
- 7. 预编译头文件设计问题
- 8. LINQ设计时编译错误
- 9. 状态设计模式 - 编译错误
- 10. WPF设计布局vs编译布局
- 11. 计算编译时数组时编译器相关的错误
- 12. OOP语言的编译器设计差异
- 13. 为64位arm设计选择gcc编译器
- 14. 编译器的设计和消除左递归
- 15. 静态绑定作品编译但不在设计器下
- 16. 哪一种编译器设计有更好的应用?
- 17. VS2008/C#编译项目时关闭所有设计器?
- 18. Windows窗体设计器编译符号:它存在吗?
- 19. 用于直接执行的编译器设计
- 20. C#的编译器设计 - 正向引用
- 21. 编译编译器错误编译GCC
- 22. 是F#编译器的诡计吗?
- 23. 浮点计算取决于编译器
- 24. 编译器错误消息:CS1513:}预计
- 25. 升压计时器不编译
- 26. 编译器错误CS1002;预计C#
- 27. cmake:编译统计
- 28. 如果英特尔编译器是默认编译器,如何为VS 2003设置本机Microsoft编译器?
- 29. 如何在c中设计编译器时集成汇编代码?
- 30. 在窗口上设置设计时间DataContext是否给出编译器错误?
我猜可以假定他的意思是不相关的空白 – 2009-09-29 18:58:57