问题描述:

用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表。如果产生词法错误,则显示错误信息、位置,并试图从错误中恢复。简单的恢复方法是忽略该字符(或单词)重新开始扫描。

相关词法规则

::=

::=

::=

::=

::=

::=

::=

::=a|b|c|……|x|y|z

::=0|1|2|3|4|5|6|7|8|9

::=+|-

::=*|/

::=|!=|>=|<=|==

::=,|;|(|)|{|}

::=main|int|if|else|while|do

编写词法分析程序的步骤:

(1)确定所要翻译的语言(或其子集)。

C语言

(2)设计属性字,及各类表格,如标识符表、常量表、符号及其机内表示对照表等。

与词法分析有关的表格:

1. 字符表

保留字:main,int,if,else,while,do

字母(全小写):a|b|c|……|x|y|z

数字:0,1,2,3,4,5,6,7,8,9

运算符和界符:,!=,>=,<=,==,,,;,(,),{,}

2. 特定单词机内表示表

3.画出总控流程图及各个子程序的流程图。

4. 程序

输入:一个存放C语言程序的s.txt文件

输出:存放以(单词,种别码)形式输出的result.txt文件

需要6个数组:

1. 存储关键字 key[6]

2. 存储对应下标关键字的种别码 keyNum[6]

3. 存储运算符和界符 symbol[17]

4. 存储运算符对应下标的种别码 symbolNum[17]

5. 存储从文件中取出的每个字符(不包括括号)letter[1000]

主要函数:

TakeWord();

功能:将文件letter[]中每个字符进行提取,找出关键字,输出种别码

Num作为全局变量保存提取到字符的哪个下标

1. 先提取一个字符,如果是字母,进入case1,调用identifier(),不断的提取字母或数字进行连接,没连接一个字符用int

isKeyWord()程序(返回关键字种别码)判断是否为关键字,是就退出函数返回string,不是就继续执行函数,直到连接的字符不再是字母或数字,即此时字符串为标识符

2. 如果是数字,进入case 2,调用Number()函数,不断进行字符串连接,知道下一个连接字符不再是数字

3. 如果是符号,进入case 3,调用symbolStr()函数,如果是=,>,

其他辅助函数:

int isSymbol()判断运算符和界符,并返回种别码

bool isNum() 判断是否为数字

bool isLetter()判断是否为字母

int isKeyWord()判断是否为关键字,是返回种别码

int typeword()返回单个字符的类型

string identifier()标识符的连接

string symbolStr()符号和界符的连接

string Number()数字的连接

void print()输出

#include #include#include#include

using namespacestd;//关键字

string key[6]={"main","int","if","else","while","do"};//关键字的种别码

int keyNum[6]={1,2,3,4,5,6};//运算符和界符

string symbol[17]={"","!=",">=","<=","==",",",";","(",")","{","}","+","-","*","/","="};//char symbol[12]={‘‘,‘!=‘,‘>=‘,‘<=‘,‘==‘,‘,‘,‘;‘,‘(‘,‘)‘,‘{‘,‘}‘};//运算符和界符的种别码

int symbolNum[17]={7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};//存放文件取出的字符

string letter[1000];//将字符转换为单词

string words[1000];int length; //保存程序中字符的数目

intnum;int isSymbol(string s){ //判断运算符和界符

inti;for(i=0;i<17;i++){if(s==symbol[i])returnsymbolNum[i];

}return 0;

}//判断是否为数字

bool isNum(strings){if(s>="0" && s<="9")return true;return false;

}//判断是否为字母

bool isLetter(strings)

{if(s>="a" && s<="z")return true;return false;

}//判断是否为关键字,是返回种别码

int isKeyWord(strings){inti;for(i=0;i<6;i++){if(s==key[i])returnkeyNum[i];

}return 0;

}//返回单个字符的类型

int typeword(stringstr){if(str>="a" && str<="z") //字母

return 1;if(str>="0" && str<="9") //数字

return 2;if(str==">"||str=="="||str=="

||str=="+"||str=="-"||str=="*"||str=="/") //判断运算符和界符

return 3;

}string identifier(string s,intn){int j=n+1;int flag=1;while(flag){if(isNum(letter[j]) ||isLetter(letter[j])){

s=(s+letter[j]).c_str();if(isKeyWord(s)){

j++;

num=j;returns;

}

j++;

}else{

flag=0;

}

}

num=j;returns;

}string symbolStr(string s,intn){int j=n+1;string str=letter[j];if(str==">"||str=="="||str=="

s=(s+letter[j]).c_str();

j++;

}

num=j;returns;

}string Number(string s,intn){int j=n+1;int flag=1;while(flag){if(isNum(letter[j])){

s=(s+letter[j]).c_str();

j++;

}else{

flag=0;

}

}

num=j;returns;

}void print(string s,intn){

cout<

}void TakeWord(){ //取单词

intk;for(num=0;num

str=letter[num];

k=typeword(str);switch(k){case 1:

{

str1=identifier(str,num);if(isKeyWord(str1))

print(str1,isKeyWord(str1));elseprint(str1,0);break;

}case 2:

{

str1=Number(str,num);

print(str1,24);break;

}case 3:

{

str1=symbolStr(str,num);

print(str1,isSymbol(str1));break;

}

}

}

}intmain(){charw;inti,j;

freopen("s.txt","r",stdin);

freopen("result.txt","w",stdout); //从控制台输出,而不是文本输出

length=0;while(cin>>w){if(w!=‘ ‘){

letter[length]=w;

length++;

}//去掉程序中的空格

}

TakeWord();//for(j=0;j

fclose(stdin);//关闭文件

fclose(stdout);//关闭文件

return 0;

}

原文:https://www.cnblogs.com/lufeibin/p/10708317.html

使用c语言编写词法分析程序,用C语言编写一个简单的词法分析程序相关推荐

  1. python编写加密程序_用Python实现一个简单的加密程序

    生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库. 对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强 ...

  2. 编写python程序 兀 3_帮忙写一个简单的python程序π_π 要求就是图上的那样 其实挺简单的但我就是写不出来。拜托了,...

    展开全部 要求提的不是很明确,按照最简单的功能来做了. 只记录姓名和电话号码62616964757a686964616fe78988e69d8331333337626138,没有做号码检验.也没有做保 ...

  3. 从头学C语言——(1)编写一个简单的C程序

    编写一个简单的C程序 编译器安装完成之后,我们就可以用它来编写代码了. 这里用Dev C++作为示例,我的是5.11的版本(后续版本是其他人开发的分支版本). 1.双击打开软件, 2.点击左上角工具栏 ...

  4. 如何编写一个简单的 Python 程序

    本教程将教你如何编写一个简单的 Python 程序.我们将从解释 Python 程序是什么开始,然后继续讨论语法的各个方面,即语言的结构. 什么是 Python? Python是一种越来越受欢迎的编程 ...

  5. 编写一个java_Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  6. Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  7. ava入门篇——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  8. 第一章 开始 |编写一个简单的C++程序

    学习目标: 编写一个简答的C++程序 学习内容: 1.一个简单的c++程序 2.输入和输出 3.关于注释 4.控制流 5.类简介 6.书店程序 1.1 编写一个简单的c++程序 每个C++程序都包含一 ...

  9. Java制作一个盒子程序_编写一个简单的Java程序,模拟计算器的功能。

    提问:编写一个简单的Java程序,模拟计算器的功能. 网友回答: 程序参考: import java.awt.*; import java.awt.event.ActionEvent; import ...

  10. 编写一个简单的考试程序,在控制台完成出题、答题的交互。试题(Question)分为单选(SingleChoice)和多选( MultiChoice)两种。

    编写一个简单的考试程序,在控制台完成出题.答题的交互.试题(Question)分为单选(SingleChoice)和多选( MultiChoice)两种.其中,单选题和多选题继承试题类,如下图所示. ...

最新文章

  1. linux 挂载光盘映像,在 Windows Mac和Linux上,如何挂载iso和其他光盘映像
  2. Mac下查看端口占用
  3. QTextCodec中的setCodecForTr等终于消失了 (Qt5)
  4. 【重点EI会议推荐】机器学习主题方向论文征稿:2021计算机、物联网与控制工程国际学术会议(CITCE 2021)...
  5. 简单说说async/await
  6. mongodb日志分析工具mtools之mplotqueries
  7. paip.设置自定义404不起作用解决.txt
  8. java环境变量配置失败_java环境变量配置失败是怎么回事?出错解决办法分享
  9. astar插件下载 就行_2020年视频编辑PR插件齐全了!包含了抠图调色磨皮降噪~
  10. 微信防撤回以及多开工具
  11. ssm毕设项目基于框架的动漫网站设计与实现q6dcx(java+VUE+Mybatis+Maven+Mysql+sprnig)
  12. MVP是什么,不是什么
  13. js中new操作符具体做了什么
  14. 核酸多样性(pi)计算公式
  15. 博弈论的一些基础知识(参考网络资料,学习总结,很好,分享并保存)
  16. Spark Stanalone HA_JZZ158_MBY
  17. 怎么用java程序控制步进电机_用单片机按键控制步进电机转动的程序怎么写
  18. 哪里有模板建站配云服务器销售,模板建站配云服务器费用
  19. 使用Jetty运行项目报错:Form too large或Form too many keys
  20. intellij idea 主题设为白色

热门文章

  1. icloud 照片同步_如何确保Mac和iPhone的照片同步到iCloud
  2. 神经网络——单层感知器
  3. 仿照支付宝等——自动获取短信中的验证码
  4. Apache doris Datax DorisWriter扩展使用方法
  5. android CTS GTS 环境搭建
  6. 热敏电阻 温度 电阻换算
  7. matlab保存tif图片
  8. sql 连接mysql数据库服务器失败_数据库连接失败的原因及解决方法
  9. 快速解决数据库连接失败
  10. 神经网络浅讲:从神经元到深度学习