一、实验目的
通过实现PL/0语言(一种示例小语言)的词法分析器,理解词法分析过程,掌握程序各部分之间的接口安排。
二、实验要求
1、要求每位同学单独完成词法分析器,并接受检查;
2、撰写实验报告。
(1)用有限自动机画出“三、实验内容”中的词法规则;
(2)对示例PL/0程序进行词法分析后的输出结果;
(3)用流程图或伪代码的形式描述程序结构(可选);
(4)书写设计和实现的过程中出现的一些问题以及解决方法(可选)。
3、关于编程语言:不限,但是如果不用C语言,无法参考课程提供资源。
三、实验内容
1、PL/0语言的单词结构
关键字(共11个):空格分隔列表如下
begin end if then while do const var call procedure odd
标识符:字母序列,最大长度10,不能与上述关键字相同
常数:整型常数
算符和界符(14个):空格分隔列表如下
+ - * / = # < > := ( ) , . ;
2、单词的种别划分
标识符:作为一种
常数:作为一种
算符和界符:每种作为一个单独种别
关键字:每个作为一个单独种别
3、PL/0的语言的词法分析器将要完成以下工作:
- 跳过分隔符(如空格,回车,制表符);
- 识别诸如begin,end,if,while等关键字;
- 识别非关键字的一般标识符。
- 识别常数数字序列。
- 识别前面列出的单字符操作符和:=双字符特殊符号。
以下是待分析PL/0代码
// PL/0 demo
(*
This is a multi-line
comment
*)
const limit = 10;
var n, f, test, t1, t2;
begin
n := 0;
f := 1;
while n # limit do
begin
n := n + 1;
f := f * n;
end;
test := 1 + 2 - 3 * 4 / ( 5 - 6 ) - 7;
t1 := test * 2;
t2 := t1 + test;
call print; // print all var
end.
以下是词法分析器实现代码
# include<iostream>
# include<string>
# include<fstream>
# include<sstream>
# include<vector>
# include<map>
#include <iostream>
using namespace std;
//以下是我对单词种别划分
/*
关键字:
begin 0
end 1
if 2
then 3
while 4
do 5
const 6
var 7
call 8
procedure 9
odd 10
运算符:
+ 11
-