一、实验目的:

设计、编制并调试一个简单的c语言词法分析程序,加深对词法分析原理的理解

二、实验要求:

  1. 对单词的构词规则有明确的定义;
  2. 编写的分析程序能够正确识别源程序中的单词符号;
  3. 识别出的单词以(单词符号,种别码)的形式保存在符号表中。

三、实验内容:

词法分析中的输入为一个C语言程序文件,该文件由如下关键字、运算符、界限符、常量、标识符中的符号构成,将该程序经词法分析后,形成的单词序列,并保存在一个文本文件(.txt)中。

  1. 单词的种类及组成
    (1)关键字
    if else while do for main return int float double char
    所有的关键字都是小写。
    (2)运算符
    = + - * / % < <= > >= != = =
    (3)界限符
    ; ( ) { }
    (4)常量
    无符号整形常量,通过以下正规式定义:
    dight dight*
    (5)标识符(ID),通过以下正规式定义:
    letter (letter | digit)*
    (6)空格有空白、制表符和换行符组成。空格一般用来分隔标识符、整数、运算符、界符和关键字,词法分析阶段被忽略。

  2. 各种单词符号对应的类别码



四、数据结构设计
主要是定义字符串和数组来保存关键字,种类码和运算符、界限符等信息。

函数设置:
1.分析器

2.

3.数字

4.单词识别

5.判断字符是什么类型

五、算法流程

六、算法结果

输入包含c语言程序的路径,结果保存至output.txt文件当中。
1.输入文件11.txt

2.output.txt保存分析结果

七、实验总结

通过这次实验我学习了简单词法分析器的基本原理,知道如何去设计一个简单的词法分析器。实验总体来说难度不大,代码量也是适中的,但是难点可能在于数据结构的设置以及编码的思路。关于数据结构我也只是使用了最简单的数组来保存需要用到的参数信息,事实上真正的词法分析器,计算机词法分析的源代码要远远复杂的多,同时其数据结构的定义也十分的考究,所以一个好的数据结构的定义对一个复杂、庞大的代码来说是十分重要的。
在实验中我也遇到一些问题,比如说用c语言对文件的处理不是特别熟悉,但是这也是十分简单的,找找资料也很容易实现。
同时也十分感谢老师的讲解,在老师的讲解之下我才能了解词法分析,掌握其基本原理,从而顺利的完成实验任务。

八、实验代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <iostream>
using namespace std;//关键字
string key[11]={"int","float","double","char","main","if","else","while","do","for","return"};
//种别码
int keyNum[11]={27,28,29,30,1,2,3,4,5,6,7};
//运算符和界符
string symbol[17]={"+","-","*","/","%",">",">=","<","<=","==","!=","=",";","(",")","{","}"};
//运算符和界符种别码
int symbolNum[17]={10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26};//从文件取出的字符
string letter[1000];
//将字符转换为单词
string  words[1000];
int length;  //保存程序中字符的长度
int num;//判断是否为关键字,是返回种别码
int isKeyWord(string s){int i;for(i=0;i<11;i++){if(s==key[i])return keyNum[i];}return 0;
}int isSymbol(string s){ //判断运算符和界符int i;for(i=0;i<17;i++){if(s==symbol[i])return symbolNum[i];}return 0;
}//判断是否为数字
bool isNumber(string s){if(s>="0" && s<="9")return true;return false;
}//判断是否为字母
bool isLetter(string s)
{if(s>="a" && s<="z")return true;return false;
}//返回单个字符的类型
int typeword(string str){if(str>="a" && str<="z")   //   字母return 1;if(str>="0" && str<="9")   //数字return 2;if(str==">"||str=="="||str=="<"||str=="!"||str==","||str==";"||str=="("||str==")"||str=="{"||str=="}"||str=="+"||str=="-"||str=="*"||str=="/")   //判断运算符和界符return 3;}string identifier(string s,int n){int j=n+1;int flag=1;while(flag){if(isNumber(letter[j]) || isLetter(letter[j])){s=(s+letter[j]).c_str();if(isKeyWord(s)){j++;num=j;return s;}j++;}else{flag=0;}}num=j;return s;
}string symbolStr(string s,int n){int j=n+1;string str=letter[j];if(str==">"||str=="="||str=="<"||str=="!") {s=(s+letter[j]).c_str();j++;}num=j;return s;
}string Number(string s,int n){int j=n+1;int flag=1;while(flag){if(isNumber(letter[j])){s=(s+letter[j]).c_str();j++;}else{flag=0;}}num=j;return s;
}void print(string s,int n){cout<<"<"<<s<<","<<n<<">"<<endl;
}void recognizeWord(){  //识别单词int k;for(num=0;num<length;){string str,ss;str=letter[num];k=typeword(str);switch(k){case 1:{ss=identifier(str,num);if(isKeyWord(ss))print(ss,isKeyWord(ss));elseprint(ss,8);break;}case 2:{ss=Number(str,num);print(ss,9);break;}case 3:{ss=symbolStr(str,num);print(ss,isSymbol(ss));break;}}}
}int main(){char w;freopen("e:\\11.txt","r",stdin); //控制台输入freopen("e:\\result.txt","w",stdout); //控制台输出length=0;while(cin>>w){if(w!=' '){letter[length]=w;length++;}   //去掉程序中的空格}recognizeWord();fclose(stdin);//关闭文件fclose(stdout);//关闭文件return 0;
}

编译原理:简单词法分析器的设计与实现相关推荐

  1. 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...

    <编译原理论文-词法分析器的设计与实现>由会员分享,可在线阅读,更多相关<编译原理论文-词法分析器的设计与实现(13页珍藏版)>请在人人文库网上搜索. 1.编译原理论文题 目 ...

  2. 编译原理简单优先分析算法

    简单优先分析算法 编译原理简单优先分析算法是一种自下而上的分析算法,本例是编译原理第三版何炎祥中一个简单优先分析算法的例子,未给出分析过程分析代码,读者可以参考我的语法分析器中输出代码,写出此算法的输 ...

  3. 编译原理之词法分析器随笔和简单实现

    借鉴:   编译原理之美. 极客时间上 什么是词法分析 编译原理:词法分析简单的来说就是在字符串中提取一系列的word单词. 编译器的眼里, 我们的一切输入都是什么? 都是一个一个的字符串. 所以编译 ...

  4. 【编译原理】词法分析器语法分析器

    简单编译器设计 采用Java语言对C++语言进行编译,具体的简单编译器设计 词法分析器-扫描器的设计与实现 基本符号表 状态转换图 代码实现 import java.io.*; import java ...

  5. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  6. 编译原理——构造词法分析器(基于 Flex 构造和手工构造)

    文章目录 一.概述 二.基于 Flex 构造词法分析器 2.1 需求描述 2.2 编译流程 2.3 Flex 代码 三.手工构造词法分析器 3.1 需求描述 3.2 实现流程 3.3 C++ 代码 四 ...

  7. 编译原理实验 —— 词法分析器

    // Lexical_Analysis.cpp : 定义控制台应用程序的入口点. // #include "stdio.h" #include "stdlib.h&quo ...

  8. 编译原理,词法分析器

    简单的词法分析器 词法分析后的结果 词法分析的过程 词法分析程序 词法分析后的结果 对一个源程序进行词法分析,得到一个二元式,单词的符合,以及对应的内码值 词法分析的过程 程序一开始的时候,先对那些常 ...

  9. 编译原理——语法分析程序的设计

    实验目的 通过设计.编制.调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法. 实验内容 设计一个文法的预测分析程序,判断特定 ...

最新文章

  1. 【阅读笔记】Thinking in Java 对象入门
  2. PHP在使用正则表达式验证,防注入的时候要注意一下的细节
  3. makefile中的@ $ :
  4. c语言标识符的词法形式,C语言词法器实验.doc
  5. Help View修复
  6. bat文件运行java的jar包不弹出dos窗口,开机自启jar包
  7. DevOps落地成不成,关键不在持续集成?
  8. java 重复代码优化_利用注解 + 反射消除重复代码(Java项目)
  9. 魅族魅蓝note3完美开启usb调试模式的经验
  10. MVC采用Jquery实现局部刷新
  11. Jquery 提交表单
  12. Sourcetree下载-使用-快速入门
  13. Python爬取招聘网站岗位信息
  14. type 与 interface 的区别
  15. 三、Linux文件颜色代表意义
  16. 2003英语单词四6级大学六级CET6资料
  17. 本地套接字(domain)
  18. 明明可以靠脸吃饭偏要靠才华_你身边有女神程序员吗?
  19. NLP面试题目汇总11-15
  20. 005永磁同步电机的数学模型:写了很久,非常适合零基础的同学学习参考

热门文章

  1. python语言案例教程单元测试答案_Python单元测试框架(附例子)
  2. sht11温湿度传感器
  3. 求大佬指点一下两个系统在服务器上用中间表做数据交互
  4. ansible软件下载
  5. TP、TN、FP、FN超级详细解析
  6. 中南大学 计算机控制,中南大学计算机控制考试重点...pdf
  7. Unmapped Spring configuration files found. Please configure Spring facet or use 'Create Default ...
  8. Flash JEDEC 查看
  9. CTF资源网站大集合
  10. 匿名管道、命名管道--Linux