c++实现编译原理词法分析实验(含代码)
c++实现编译原理词法分析实验(含代码)
一、实验目的:
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
二、程序思路(仅供参考):
这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。
0.定义部分:定义常量、变量、数据结构。
1.初始化:从文件将源程序全部输入到字符缓冲区中。
2.取单词前:去掉多余空白。
3.取单词后:去掉多余空白(可选,看着办)。
4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)
5.显示结果。
以上都是废话,直接看代码吧
代码
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include<string>
#define M 20
using namespace std;
string keyword[9] = { "main","if","int","for","while","do","return","break","continue" };//关键字=1//标识符值=2//常数值=3
char arithmetic[4] = { '+','-','*','/' }; //算术运算符=4
char relation[6] = { '=','>','<','>=','<=','!=' };//关系运算符=4
char border[6] = { ';',',','{','}','(',')' }; //分隔符=5/**判断是否为关键字**/
bool IsKeyword(string word) {for (int i = 0; i<9; i++) {if (keyword[i] == word) {return true;}}return false;
}
/**判断是否为算术运算符**/
bool IsArithmetic(char ch) {for (int i = 0; i<4; i++) {if (arithmetic[i] == ch) {return true;}}return false;
}
/**判断是否为关系运算符**/
bool IsRelation(char ch) {for (int i = 0; i<6; i++) {if (relation[i] == ch) {return true;}}return false;
}
/**判断是否为分隔符**/
bool IsBorder(char ch) {for (int i = 0; i<6; i++) {if (border[i] == ch) {return true;}}return false;
}/**判断是否为字母**/
bool IsLetter(char ch) {if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') return true;return false;
}
/**判断是否为数字**/
bool IsDigit(char ch) {if (ch >= '0' && ch <= '9') return true;return false;
}
// 常数
char DigitProcess(char ch, FILE* fp)
{int i = -1;char digit[M];while ((IsDigit(ch))){digit[++i] = ch;ch = fgetc(fp);}digit[i + 1] = '\0';cout << "(3 , " << digit << " )" << " 常数" << endl;return(ch);
}
// 标识符、关键字
char AlphaProcess(char ch, FILE* fp)
{int i = -1;char alpha[M];while (IsLetter(ch) || (IsDigit(ch))){alpha[++i] = ch;ch = fgetc(fp);}alpha[i + 1] = '\0';if(IsKeyword(alpha))cout << "(1 , " << alpha << " )" << " 关键字" << endl;elsecout << "(2 , " << alpha << " )" << " 标识符" << endl;return(ch);
}
// 运算符 、界符
char OtherProcess(char ch, FILE* fp)
{int i = -1;char othertp[M];othertp[0] = ch;othertp[1] = '\0';if (IsArithmetic(ch))//算术运算符{cout << "(4 , " << othertp << " )" << " 运算符" << endl;ch = fgetc(fp);}if (IsRelation(ch))//关系运算符{ch = fgetc(fp);othertp[1] = ch;othertp[2] = '\0';if (IsRelation(ch))cout << "(4 , " << othertp << " )" << " 运算符" << endl;else{othertp[1] = '\0';cout << "(4 , " << othertp << " )" << " 运算符" << endl;}}if (IsBorder(ch))//分界符{cout << "(5 , " << othertp << " )" << " 分隔符" << endl;ch = fgetc(fp);}ch = fgetc(fp);return(ch);
}
int main()
{char ch;FILE *fp;if (fopen_s(&fp, "E:\\test.txt", "r") != NULL) // 判断源文件是否存在cout<<" 文件不存在 "<<endl;else{ch = fgetc(fp); // 读入字符while (ch != EOF) // 如果文件没有结束 ,就一直循环{if (IsLetter(ch)) // 如果是字母ch = AlphaProcess(ch, fp);else if (IsDigit(ch)) // 数字ch = DigitProcess(ch, fp);elsech = OtherProcess(ch, fp);}cout << "end" << endl;getchar();}return 0;
}
不知道是不是代码bug,文件内容必须要用空格隔开
test.txt文件
main( )
{int a , b , c ;
a = 10 ;
c = ( a + b ) ;
}
运行结果
出现的一些问题
我用的vs,开始用fp=fopen("E:\\test.txt","r"))
,会报
error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
改成fopen_s(&fp, "E:\\test.txt", "r") != NULL
就行了
c++实现编译原理词法分析实验(含代码)相关推荐
- 编译原理词法分析实验
目录 实验内容描述 实验设计 输入输出形式 样例输入和样例输出 实验设计原理(步骤) 主要函数和辅助函数 核心代码截图 实验结果 可以找我代做,包满分.QQ1975728171可以写完整实验报告 实验 ...
- [编译原理]词法分析实验之基于 DFA 的单词识别
Spring-_-Bear 的 CSDN 博客导航 问题描述: 基于 DFA 的单词识别问题的一种描述是:编写一个程序,输入一个确定的有穷自动机(DFA),使用该 DFA 识别单词. 基本要求: 设置 ...
- 《编译原理》实验报告——递归下降语法分析器的构建
一.实验要求 运用递归下降法,针对给定的上下文无关文法,给出实验方案.预估实验中可能出现的问题. 二.实验方案 1.构造LL(1),通过设计.编制.调试递归下降语法分析程序,对输入的符号串进行分析匹配 ...
- 编译原理词法分析程序设计
编译原理词法分析程序设计 1. 课程设计目的: 结合讲授内容,设计与实现一个简单词法分析器,通过设计编制调试一个具体的词法分析程序,加深对词法分析程序的功能及实现方法的理解.并掌握在对程序设计语言 ...
- 【SEUSE】编译原理 - 词法分析器实验报告
[SEU&SE]编译原理 - 词法分析器实验报告 README 一. 实验目的 二. 实验环境 1. 开发环境: 2. 运行环境 三. 实验内容 1. 主要内容 2. 主要功能 3. 种别码 ...
- 编译原理:实验一练习
编译原理:实验一练习 词法分析器 编译原理实验报告 上面的第一个链接中的词法分析器有一点问题,修改后的代码如下: #include "string.h"#include " ...
- c语言的适当大小的子集,编译原理上机实验报告
编译原理上机实验报告,编制C语言子集的词法分析程序,编制递归下降法的语法分析程序 编译技术上机实验题目 实验一 一.题目 编制C语言子集的词法分析程序 二.目的 通过设计.编制.调试一个具体的词法分析 ...
- 【最新合集】编译原理习题(含答案)_答案全集_MOOC慕课 哈工大陈鄞
[最新合集]编译原理习题(含答案)_1 绪论_MOOC慕课 哈工大陈鄞 [最新合集]编译原理习题(含答案)_2程序设计语言及其文法_MOOC慕课 哈工大陈鄞 [最新合集]编译原理习题(含答案)_3词法 ...
- 《编译原理》实验教学大纲
<编译原理>实验教学大纲 课程编号: 773033 课程名称:编译原理 英文名称:Compiler Principle 课程类型: 模块课 学 时:5 学 分:4 适用对象: 软件开发各专 ...
最新文章
- java url连接,Java - 线程中的URL连接
- 椭圆形中间一个大写的v_年轻人想要的出街姿态,新CR-V整的明明白白
- Stark 组件:快速开发神器 —— 页面显示
- python 英语词频统计软件_Python实现统计英文文章词频的方法分析
- RHEL5***检测系统(IDS)snort的安装与配置,建议用BASE做控制台
- 【报告分享】如何嫁给“改变世界的男人”-程序员之理想女友大调查.pdf(附下载链接)...
- [XHTML Tutorial] 走向XHTML标准 (4)(XHTML Syntax)
- Java vs ECS,垃圾回收的乾坤大挪移?
- 网页端实时音视频服务架构与实践
- 环境影响评价知识点整理
- Web Polygraph 安装
- matlab中电流继电器,电流电压继电器特性实验的数字仿真
- IDEA中Python使用url时报错:Traceback (most recent call last)
- BZOJ 3162 独钓寒江雪
- java遍历文件夹下所有图片_遍历指定文件夹下的所有图片,并复制到指定目录下...
- C语言实现图的深度优先遍历和广度优先遍历
- HTML中屏蔽Enter键
- 基于java的奖学金评定系统设计与实现
- pgsql报错:User query might have needed to see row versions that must be removed.
- es中should查询使用注意