> 文章列表 > 用ToyParser轻松掌握Lexer和Parser

用ToyParser轻松掌握Lexer和Parser

用ToyParser轻松掌握Lexer和Parser

大家好!今天我要给大家介绍一个有趣的项目,名叫ToyParser。这个项目包含了一个简单的Lexer和Parser,帮助你轻松掌握Lexer和Parser的基础知识。不用担心,你不需要成为编译器专家,就可以理解这个项目。相信我,它很好玩!

简单的Lexer和Parser

首先,我们来看看ToyParser项目的第一部分,也就是一个超级简单的语言的Lexer和Parser。

它只有三个TOKEN:abEND,以及一个简单的grammar:'S -> a b a'。没错,就这么简单!这是一个极好的起点,可以帮助您了解LexerParser的基本原理。

唯一有效的程序: a b a

无效程序,比如: a b c

如果你觉得这太简单了,那么请耐心等待。下一个部分将更加有趣。

复杂的Lexer和Parser

现在,我们进入ToyParser项目的第二部分:一个更加复杂的LexerParser。这个LexerParser是专门用来处理具有多种标记的语言的。比如,关键字、特殊符号、标识符、类型和操作符等。语言的语法也更加复杂,但相信我,你仍然可以轻松掌握。只需要一些耐心和好奇心!

下面是对这个语言的描述

有效的token

  • keyword: return
  • special token: ; | ( | ) | { | } | ,
  • identifier: f | a | b;
  • type: int | float
  • operator: + | -

这个项目重点是放在Parser,所以我们的lexer相当简单。

  1. i 开头的只能是 int
  2. f 开头的可以是identifier, 或者 float
  3. 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

有效程序举例

  1. valid program 1:

    int f(int a, float b) {return a + b - a;
    }
    
  2. valid program 2:

    int f(int a, int b) {return b - a;
    }
    
  3. 无效程序举例

    int f(int a, float b {  // missing )return a + b - a;
    }
    

但是,如果你真的想挑战自己,你可以尝试去编写一个全功能的Lexer和Parser。但是,请不要期望可以在一夜之间成为编译器专家。这个有点难,而且费键盘。太多琐碎而重复的代码了。

备注

在使用ToyParser之前,有几个注意事项需要说明。首先,这个项目旨在作为学习工具,而不是生产就绪的Lexer和Parser。其次,请不要认为你已经掌握了编写编译器的所有技能。毕竟,这只是一个开始。(我知道你们和我一样是人间清醒,哈哈)

最后,如果你发现了任何错误或者有任何改进意见,欢迎告诉我们!不过请不要期望这个项目能够实现所有功能,因为这样太难了。或许也有可能,在我能不挂科通过这个课之后吧。

哦,项目地址: 传送门