作者回复: 没错,可以的。
但是构造成有限自动机的话,程序就可以标准化处理。不需要再手写其他代码。比如正则表达式工具。
当然,如果纯手写词法分析器,不受任何标准算法的限制的话,那发挥空间就会大很多。
爱动脑的好同学!
作者回复: 课程的示例代码的主要目的是把意思讲明白,我甚至把状态都用枚举表示,就是为了易读。性能不是第一考虑。
从性能的角度,词法分析可以用查表的方法实现状态迁移。在每个状态,接收什么字符,切换到另外的状态。那样更快,这是常用的方法。
不光词法分析可以这么做,语法分析也可以。基于表驱动。这时候,最重要的是构造那张表。代码的话,就不大看明白是啥意思。
作者回复: 有限自动机是比较简单的一种自动机,对应于正则文法,也叫做3型文法。
比它强大的是下推自动机,对应于上下文无关文法,也叫做2型文法。
比它更强大的是线性有界自动机,对应于上下文相关文法,也叫1型文法。
图灵机的范围比它们都大,它对应0型文法。你任何能用产生式写出来的文法规则,都属于0型文法。
希望对你有帮助,了解有限自动机和图灵机的关系:)
作者回复: 最好的demo,就是现有语言的词法分析器,比如Java的、GNU c的,都能拿到源代码。比如Java的编译器在JDK的源代码里就有。
此外,我们在后端时会讲到LLVM工具。LLVM的文档里有一个小的教程,做了一个完整的前端。你也可以参考一下。http://llvm.org/docs/tutorial/MyFirstLanguageFrontend/LangImpl01.html
回头我整理一份清单放到github上,告诉大家去哪里下载。你的需求估计其他同学也有。
谢谢你!
作者回复: 很好的问题。
是这样的。从Token分类的角度,我们确实可以把这两个归为一类。
但如果把它们看做同一个状态,就会有一些问题。比如,接收到=号应该怎么处理呢?接收第一个=号,仍然处于比较操作符状态。那么接收第二个呢?问题是,有限状态机接收字符的时候,是没法数个数的。如果你要记个数,也就相当于在内部新增加了一个状态,还是等价于两个状态。我这么说你理解吗?
作者回复: great!
基于你已有的积累,是否可以进一步想想,能否自己写一个支持正则的工具?比如像grep、sed这些超级命令一样。那几个命令被认为是神级的命令,就是因为支持正则表达式,让它们能适应各种情况。
作者回复: 好的,谢谢您提意见!已通知后台调整一下。
02课的文件是目录中的SimpleLexer.java文件。
另,如果到github的https://github.com/RichardGong/PlayWithCompiler项目主页,里面有每堂课的课件的介绍,供您参考。
作者回复: 你很细心,所以我也仔细给你解答下:-)
isAlpha是 is alphabetic 的缩写。isalpha()函数是好几个语言的标准库里都提供的,比如C、python等。
alphabet指的是整个字母表,不是字母表里的单个字母。
作者回复: 哇,真好玩!
点赞!
作者回复: 嗯。等你学了算法篇第16讲,了解了正则表达式的机制后,可以设计点正则表达式测试一下谷歌的性能,看看能否把谷歌的服务器累趴下...
作者回复: 在编译领域,有一个事情,叫做自举(bootstraping),也就是这门语言的编译器可以用自己这门语言编写。这是语言迈向成熟的标志。一般前面的版本,是要借助别的语言编写编译器,但后面就应该用自己的语言来编译了。
著名的语言都实现了自举。比如,go语言的编译器是用go编写的(早期版本应该是用C语言写的编译器。能实现自举,还是go发展历程上的一个历程碑),jdk里面自带了java语言的编译器,本身也是用java写的。
更早的语言,那当然是用汇编写编译器。比尔盖茨当年就是用汇编写。
掌握编译原理之后,其实用什么语言都可以写。
这门课程的示例语言是playscript。我有计划后面把playscript实现自举。
作者回复: 非常好!要号召大家跟你学习!
太棒了!
你有精力的话,还可以再精进一下,参考一下成熟编译器的词法分析工具,从课程示例的代码的基础上再提升一个等级:)
比如说,另一个同学提到过,如何提升词法分析的性能什么的。
作者回复: 就是个习惯而已,把数字和字符分两组。
我们在写正式的词法文件时,有时会这么写:
Id: Charactor (Charactor | Digit)*
Number: Digit+
Charactor: [a-zA-Z_]
Digit: [0-9]
这时候,Digit在几个不同的规则中是复用的。
作者回复: 是滴。
程序编译的第一阶段工作,本质也是文本处理。
作者回复: 看到了,不错!
破山中贼易,破心中贼难。
任何高峰,都是能找到一条缓坡上去的。
作者回复: 看了你的代码,挺不错的。如果再补充一下README,让人可以迅速build和测试你的项目就更好了。
作者回复: 下载,编译,并运行了。
你提供的cmake配置很赞,让编译很顺畅!
也看出你C++功底很扎实呀!
再次点赞!
作者回复: 可以呀。
算法可以是灵活的,可以有多种实现。课程里讲的理论往往更通用,比如可以根据正则表达式自动生成有限自动机。
在具体领域中,比如如果只是给计算机语言做词法分析,当然可以针对关键字这种特殊情况做特殊处理。
所以,在实际工程中,往往比纯原理更简单。因为允许变通。
作者回复: 谢谢肯定:)
作者回复: 谢谢分享!
没错,这是词法分析的应用之一。
再进一步,在处理一些复杂格式的日志时,仅仅用词法分析还不够,还要加上语法分析功能才行。