编译原理实验:词法分析器

一、实验目的

通过实现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的语言的词法分析器将要完成以下工作:

  1. 跳过分隔符(如空格,回车,制表符);
  2. 识别诸如begin,end,if,while等关键字;
  3. 识别非关键字的一般标识符。
  4. 识别常数数字序列。
  5. 识别前面列出的单字符操作符和:=双字符特殊符号。

以下是待分析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
    -
  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值