用ToyParser轻松掌握Lexer和Parser
大家好!今天我要给大家介绍一个有趣的项目,名叫ToyParser。这个项目包含了一个简单的Lexer和Parser,帮助你轻松掌握Lexer和Parser的基础知识。不用担心,你不需要成为编译器专家,就可以理解这个项目。相信我,它很好玩!
简单的Lexer和Parser
首先,我们来看看ToyParser项目的第一部分,也就是一个超级简单的语言的Lexer和Parser。
它只有三个TOKEN:a
,b
和END
,以及一个简单的grammar:'S -> a b a'
。没错,就这么简单!这是一个极好的起点,可以帮助您了解Lexer
和Parser
的基本原理。
唯一有效的程序: a b a
无效程序,比如: a b c
如果你觉得这太简单了,那么请耐心等待。下一个部分将更加有趣。
复杂的Lexer和Parser
现在,我们进入ToyParser
项目的第二部分:一个更加复杂的Lexer
和Parser
。这个Lexer
和Parser
是专门用来处理具有多种标记的语言的。比如,关键字、特殊符号、标识符、类型和操作符等。语言的语法也更加复杂,但相信我,你仍然可以轻松掌握。只需要一些耐心和好奇心!
下面是对这个语言的描述
有效的token
- keyword: return
- special token: ; | ( | ) | { | } | ,
- identifier: f | a | b;
- type: int | float
- operator: + | -
这个项目重点是放在Parser,所以我们的lexer相当简单。
- i 开头的只能是 int
- f 开头的可以是identifier, 或者
float
- a, b 开头的只能是identifer,且只有一个字母
欢迎大家帮我实现完整功能的lexer,我其实已经实现了一个完善的lexer,但是要当作业,所以我就不发出来了。
唯一有效的grammar:
S -> T ID ( P ) { B }
T -> int | float
P -> T ID | T ID , P
B -> return E ;
E -> ID | ID + E | ID - E
ID -> f | a | b
有效程序举例
-
valid program 1:
int f(int a, float b) { return a + b - a; }
-
valid program 2:
int f(int a, int b) { return b - a; }
-
无效程序举例
int f(int a, float b { // missing ) return a + b - a; }
但是,如果你真的想挑战自己,你可以尝试去编写一个全功能的Lexer和Parser。但是,请不要期望可以在一夜之间成为编译器专家。这个有点难,而且费键盘。太多琐碎而重复的代码了。
备注
在使用ToyParser之前,有几个注意事项需要说明。首先,这个项目旨在作为学习工具,而不是生产就绪的Lexer和Parser。其次,请不要认为你已经掌握了编写编译器的所有技能。毕竟,这只是一个开始。(我知道你们和我一样是人间清醒,哈哈)
最后,如果你发现了任何错误或者有任何改进意见,欢迎告诉我们!不过请不要期望这个项目能够实现所有功能,因为这样太难了。或许也有可能,在我能不挂科通过这个课之后吧。
哦,项目地址: 传送门
转载自:https://juejin.cn/post/7220054775298261047