编译原理实验(一):词法分析-根据 PL/0 语言的文法规范,编写 PL/0 语言的词法分析程序

本文档介绍了如何根据 PL/0 语言的文法规范设计和实现词法分析程序。实验目的是理解词法分析方法,从源程序中分出单词,并以二元式序列作为输出。实验内容包括编写 C++ 代码,识别关键字、专用符号和其他标记。文中还详细描述了设计过程、算法流程,并给出了具体的输入输出示例。
摘要由CSDN通过智能技术生成

**

任务说明

**
1. 实验目的
根据 PL/0 语言的文法规范,编写 PL/0 语言的词法分析程序;或者调研词法分析程序的自动生成工具 LEX 或 FLEX,设计并实现一个能够输出单词序列的词法分析器。通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。 掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
 掌握词法分析的实现方法。
 上机调试编出的词法分析程序。
2. 实验准备
C++
3.实验内容
已给 PL/0 语言文法,输出单词符号(关键字、专用符号以及其它标记)。
4. 实验要求 
把词法分析器设计成一个独立一遍的过程。 词法分析器的输出形式采用二元式序列,即:(单词种类, 单词的值)
5. 输入输出
输入:PL/0 源程序。例: const a=10;
var b,c;
begin
read(b);
c:=a+b;
write©
end.
输出:
(constsym,const)
(ident , a)
(eql , =)
(number, 10)
(semicolon, ; )
(varsym, var )
(ident, b)
(comma, , )
(ident, c )
(semicolon, ; )
(beginsym,begin)
(readsym, read )
(lparen, ( )
(ident, b)
(rparen, ) )
(semicolon, ; )
(ident, c )
(becomes, := )
(ident, a )
(plus, + )
(ident, b )
(semicolon, ; )
(writesym,write)
(lparen, ( )
(ident, c )
(rparen, ) )
(endsym, end )
(period, .)

具体实现

设计

在这里插入图片描述
为了画图简便,假设字母为Z,数字为D,运算符为Y,界符为J
设计r->NFA->DFA(最小化)
识别所有单词的r=(Z(Z|D))|((D)(D))|Y|J
NFA如下:
在这里插入图片描述
在这里插入图片描述

算法流程

在这里插入图片描述

代码

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//用于识别是基本字或标识符
void Letter(string str){
   
    /*-------------------识别基本字--------------------*/
    if(str=="begin")
        cout<<"(beginsym,begin)"<<endl;
    else if(str=="call")
        cout<<"(callsym,call)"<<endl;
    else if(str=="const")
        cout<<"(constsym,const)"<<endl;
    else if(str=="do")
       cout<<"(dosym,do)"<<endl;
    else if(str=="end")
        cout<<"(endsym,end)"
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值