首先,我不学习计算机科学,我只是对这个学科感兴趣。
解析器基本上做到了这一点:
- 读取输入
- 创建令牌
- 实际解析令牌并创建一个 AST
所以我认为为了确定一个单词是否是常规语言,你使用 FSM,而对于 CF 语言,你需要一个解析器,因为可能存在递归结构。因此,存在用于常规语言的扫描器生成器和用于 CF 语言的解析器生成器。
但是现在我读到你可以为正则表达式构建一个递归的体面解析器:
http://matt.might.net/articles/parsing-regex-with-recursive-descent/
那么这一切是如何结合在一起的呢?
为什么我需要解析常规语言?我认为有限状态机就足够了?
例如,如果我想识别 java 程序中的块注释(即/* .. */
),我只需要编写一个 FSM,所以基本上是一个 switch-case-statement。我不需要解析器...
感谢您的帮助和澄清!