大家好!今天我要给大家介绍一个有趣的项目,名叫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相当简单。

  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。其次,请不要认为你已经掌握了编写编译器的所有技能。毕竟,这只是一个开始。(我知道你们和我一样是人间清醒,哈哈)

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

    哦,项目地址: 传送门

    大家好!今天我要给大家介绍一个有趣的项目,名叫ToyParser。这个项目包含了一个简单的Lexer和Parser,帮助你轻松掌握Lexer和Parser的基础知识。不用担心,你不需要成为编译器专家,就可以理解这个项目。相信我,它很好玩!
    面试官:请你讲讲你在该项目中遇到的问题是什么?你怎么解决这个问题? 答:我的回答:该项目的实现过程中我确实遇到了问题:【我会给大家整理回答思路和角度,那那么遇到这样的问题也可借鉴这种思路进行阐述】 层次一:分析页面:【原型图如下】 Huoshancrc: 这段代码只能处理行小于列的情况,当行大于列的时候是无法处理的。比如六行四列,我们没有办法从第一行找出第五个第六个字母,放在第五行第六行开头。题目要求没有说列必须大于行,所以是部分正确。可以这样改 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int m=sc.nextInt(); char[][] arr=new char[n][m];