编译原理实验:词法分析

  • 1. 实验题目:词法分析
    • 实验目的
    • 实验内容
    • 实验要求
    • 输入输出
  • 2. 设计思想
  • 3.算法流程
  • 4. 源程序
  • 5. 调试数据

1. 实验题目:词法分析

实验目的

  1. 根据PL/0语言的文法规范,编写PL/0语言的词法分析程序;或者调研词法分析程序的自动生成工具LEX或FLEX,设计并实现一个能够输出单词序列的词法分析器。
  2. 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。
  3. 掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的法。
  4. 掌握词法分析的实现方法。上机调试编出的词法分析程序。

实验内容

 已给PL/0语言文法,输出单词符号(关键字、专用符号以及其它标记)。

实验要求

  1. 把词法分析器设计成一个独立一遍的过程。
  2. 词法分析器的输出形式采用二元式序列,即:(单词种类,单词的值)

输入输出

输入:
  const a=10;
  var b,c;
  begin
  read(b);
  c:=a+b;
  write( c);
  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, .)

2. 设计思想

基本字:

单词(编码) 正规式r
begin(beginsym) begin
call(callsym) call
const(constsym) const
do(dosys) do
end(endsym) end
if(ifsym) if
odd(oddsym) odd
procedure(proceduresym) procedure
read(readsym) read
var(varsym) var
while(whilesym) while
write(writesym) write
then(thensym) then
标识符:
单词(编码) 正规式r
----- -----
<标识符>(ident) (字母)(字母 |数字)*
常数:
单词(编码) 正规式r
----- -----
<常数>(ident) (数字)(数字)*
运算符:
单词(编码) 正规式r
----- -----
+(plus) +
-(minus) -
*(times) *
/(slash) /
=(eql) =
<>(neq) <>
<(lss) <
<=(leq) <=

(gtr)|>
=(geq)|>=
:=(becomes)|:=
界符:
单词(编码)| 正规式r
-----|-----
( (lparen)| (
) (rparen)| )
, (comma)| ,
; (semicolon)| ;
. (period)| .

3.算法流程

  1. 词法分析程序打开源文件,读取文件内容,直至遇上文件结束符,然后读取结束。
  2. 接下来就要对源文件从头到尾进行扫描了,从头开始扫描,这个时候扫描程序首先要询问当前的字符是不是空格,若是空格,则继续扫描下一个字符,直至不是空格。然后询问这个字符是不是字母,若是则进行标识符和保留字的识别;若这个字符为数字,则进行数字的判断。否则,依次对这个字符可能的情况进行判断(界符和运算符),若将所有可能都走了一遍还是没有知道它是谁,则认定为错误符号,输出该无法识别error,程序结束。每次成功识别了一个单词后,单词都会存在word1[]数组中,然后字符指针往后移,进行下一个单词的识别。
  3. 主控程序需要负责对每次识别的种别码进行判断,对于不同的单词种别做出不同的反应,直至文件结束。
  4. 本次实验我采用了map这个STL关联容器,主要是考虑到词法分析中的数据映射的关系,因此采用这种结构。map提供一对一的数据处理能力,其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值。这个容器是非常方便使用的,对于查找可以直接使用迭代器进行,利用find()函数,若一直到末尾都未找到,则是不能识别或为标识符。

4. 源程序

#include<bits/stdc++.h>
using namespace std;
map<string,string> word;//应用map数据结构形成一个string->string的对应
std::map<string,string>::iterator it;//用来遍历整个对应关系的迭代器
void map_init(){//对应关系进行初始化word["begin"]="beginsym";word["call"]="callsym";word["const"]="constsym";word["do"]="dosym";word["end"]="endsym";word["if"]="ifsym";word["odd"]="oddsym";word["procedure"]="proceduresym";word["read"]="readsym";word["then"]="thensym";word["var"]="varsym";word["while"]="whilesym";word["write"]="writesym";word["+"]="plus";word["-"]="minus";word["*"]="times";word["/"]="slash";word["="]="eql";word["<>"]="neq";word["<"]="lss";word["<="]="leq";word[">"]="gtr";word[">="]="geq";word[":="]="becomes";word["("]="lparen";word[")"]="rparen";word[","]="comma";word[";"]="semicolon";word["."]="period";
}
int main(){map_init();//初始化char ch;char a;string word1;//string变量识别单词string str;//string变量进行字符识别ifstream infile("F:\\编译原理\\第一次实验\\analysis.txt");//文件输入流ofstream outfile("F:\\编译原理\\第一次实验\\result.txt");//文件输出流ostringstream buf;while(buf&&infile.get(ch)) buf.put(ch);//将文件中的字符读出来str= buf.str();//将得到的字符储存到string类型变量中int csize=str.length();for(int i=0;i<csize;i++){//对整个字符串进行遍历while(str[i]==' '||str[i]=='\n') i++;//若最开始为空格或换行符,则将指针的位置往后移if(isalpha(str[i])){//对标识符和基本字进行识别,调用库函数isalpha()word1=str[i++];while(isalpha(str[i])||isdigit(str[i])){word1+=str[i++];}it=word.find(word1);if(it!=word.end()){//判断是不是基本字,若为基本字则进行输出cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else{//否则直接输出cout<<"(ident"<<","<<word1<<")"<<endl;}i--;}else if(isdigit(str[i])){//判断是不是常数,调用库函数isdigit()word1=str[i++];while(isdigit(str[i])){word1+=str[i++];}if(isalpha(str[i])){cout<<"error!"<<endl;break;}else{cout<<"(number"<<","<<word1<<")"<<endl;}i--;}else if(str[i]=='<'){//对<,<=分别进行判断word1=str[i++];if(str[i]=='>'){word1+=str[i];cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else if(str[i]=='='){word1+=str[i];cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else if(str[i]!=' '||!isdigit(str[i])||!isalpha(str[i])){cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else{cout<<"error!"<<endl;break;}i--;}else if(str[i]=='>'){//对>,>=分别进行判断word1=str[i++];if(str[i]=='='){word1+=str[i];cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else if(str[i]!=' '||!isdigit(str[i])||!isalpha(str[i])){cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else{cout<<"error!"<<endl;break;}i--;}else if(str[i]==':'){//对:=进行判断word1=str[i++];if(str[i]=='='){word1+=str[i];cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else{cout<<"error!"<<endl;break;}i--;}else{//对其他的基本字依次进行判断word1=str[i];it=word.find(word1);if(it!=word.end()){cout<<"("<<word[word1]<<","<<word1<<")"<<endl;}else{cout<<"error!"<<endl;break;}}}infile.close();return 0;
}

5. 调试数据

待输入的文件流:

输出数据:


说明:如上实验仅符合当时实验要求的相关条件,其他的需求略微进行更改就行,思想是一样的,还是很简单的。输入输出自己按自己需求更改即可。

编译原理实验:词法分析相关推荐

  1. 编译原理实验一 词法分析程序设计与实现

    一.实验目的 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词构成的序列的词法分析方法. 二.基本实验内容与要求 假定一种高级程序 ...

  2. 词法分析程序的设计(编译原理实验一)

    词法分析程序的设计(编译原理实验一) 一.实验内容 ​ 编制一个能够分析三种整数.标识符.主要运算符和主要关键字的词法分析程序. 二.实验要求 编写程序,识别如下单词符号 标识符 <字母> ...

  3. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  4. 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现

    一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...

  5. 编译原理实验:代码生成作业(1)

    编译原理实验4:中间代码生成实验包-C++文档类资源-CSDN下载编译原理实验4:中间代码生成实验包更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.net/d ...

  6. 编译原理--实验2 语法分析

    文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...

  7. 编译原理实验二:赋值语句的语法分析程序设计

    编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...

  8. 编译原理实验:自上而下语法分析

    编译原理实验:自上而下语法分析 1. 实验题目:自上而下语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自上而下语法分析 ...

  9. 编译原理——java 词法分析【有穷自动机实现】

    编译原理--实验1 实验要求 1) 基于词法规则设计词法分析器(20分) 画出确定的有穷自动机(确定化),并提供必要的文字说明.提交状态转换图.doc 2) 词法分析程序的编程实现(80分) (1) ...

最新文章

  1. Xamarin.Android提示找不到mono.Android.Support.v4
  2. java简单纸牌游戏_2020年最佳2人棋盘游戏:拼凑,Kingdomino等
  3. 【leetcode】Path Sum II
  4. java字符串学习_java之字符串学习记录
  5. [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点
  6. 禁用UITabBarController双击事件
  7. mac nginx映射ip和端口_步骤四、nginx反向代理
  8. Sequel Pro登录失败
  9. [洛谷P3391] 文艺平衡树 (Splay模板)
  10. hash ruby 定义 嵌套_【译】rails的嵌套属性(Nested Attributes)使用
  11. 中国电子银行网-互联网金融第一大网站
  12. Oracle自定义函数示例
  13. java中的Date类
  14. docker 容器安装 vim 编辑器
  15. 2019年 Paypal怎么提现
  16. 离群值是什么意思_ESD—检验离群值
  17. 下一代IP协议----IPV6
  18. 林语堂、陆谷孙、薄冰、许国璋、何其莘等十位国宝级语言大师谈英语学习方法
  19. 推广有哪些渠道?用好这4个引流渠道日引200
  20. 一个小兔子的大数据见解2

热门文章

  1. 2023最新OneTheme彩虹易支付用户模板美化主题模板源码/包括Admin端
  2. 贝壳如何docker安装openwrt_N1小钢炮利用Docker创建OpenWrt容器实现旁路由
  3. ElasticSearch学习笔记-索引构建
  4. 从事iOS开发八年,却只发布了一款APP
  5. Teamface一体化打通CRM+ OA+HR +ERP+SCM全流程管理系统
  6. AllJoyn:打造全球物联网的通用开
  7. BNUOJ-4052-BT马
  8. 【转】免费发手机短信的内幕
  9. Android studio中将gbk转换为utf-8编码
  10. Android 手机存储相关内容