词法分析器(分析C语言)

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

问题描述:

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

(1)确定所要翻译的语言(或其子集)。
C语言
(2)设计属性字,及各类表格,如标识符表、常量表、符号及其机内表示对照表等。
与词法分析有关的表格:
1. 字符表








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 namespace std; //关键字 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; //保存程序中字符的数目 int num; int isSymbol(string s){ //判断运算符和界符 int i; for(i=0;i<17;i++){ if(s==symbol[i]) return symbolNum[i]; } return 0; } //判断是否为数字 bool isNum(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 isKeyWord(string s){ int i; for(i=0;i<6;i++){ if(s==key[i]) return keyNum[i]; } return 0; } //返回单个字符的类型 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(isNum(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(isNum(letter[j])){ s=(s+letter[j]).c_str(); j++; } else{ flag=0; } } num=j; return s; } void print(string s,int n){ cout<<"("<               >w){ if(w!=' '){ letter[length]=w; length++; } //去掉程序中的空格 } TakeWord(); // for(j=0;j                                 

运行结果:

s.txt

这里写图片描述

Result.txt

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202569.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:49
下一篇 2026年3月19日 下午11:50


相关推荐

  • Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]

    Mask_RCNN训练自己的数据——制作COCO格式的数据集[通俗易懂]matterport版mask_rcnn系列:1.Mask_RCNN训练自己的数据2.目标检测:使用Open_cv在图像上批量画boundingbox3.Mask_RCNN:使用COCO权重进行特定类别预测(只标记出你需要的类别)4.Mask_RCNN:ValueError:Dimension1inbothshapes……………

    2022年10月4日
    4
  • HTML5+CSS3学习总结(完结)

    一、HTML5的语义化二、CSS3动画三、CSS3阴影四、CSS3过渡(非常重要)五、弹性布局六、栅格布局七、渐变八、媒体查询

    2022年4月9日
    56
  • 【Java-Set转List】

    【Java-Set转List】这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Mar

    2022年10月18日
    4
  • mvnw的作用_尼康D200色影无忌

    mvnw的作用_尼康D200色影无忌mvnw

    2025年6月8日
    4
  • 浅谈大数据风控平台的功能需求

    浅谈大数据风控平台的功能需求导读 大数据风控业务的开展依赖智能风控平台 智能风控平台的技术基础是大数据技术 智能风控系统技术架构也是以大数据系统技术架构为基础演进而来的 智能风控系统技术架构主要分为访问层 展现层 系

    2026年3月20日
    2
  • <C++学习笔记>iterator C++

    <C++学习笔记>iterator C++

    2021年8月19日
    78

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号