资源简介
a) 启动程序后,先输出作者姓名、班级、学号(可用汉语、英语或拼音);
b) 请求输入测试程序名,键入程序名后自动开始词法分析并输出结果;
c) 输出结果为单词的二元式序列(样式见样板输出1和2);
d) 要求能发现下列词法错误和指出错误性质和位置:
非法字符,即不是SAMPLE字符集的符号;
字符常数缺右边的单引号(字符常数要求左、右边用单引号界定,不能跨行);
注释部分缺右边的界符*/(注释要求左右边分别用/*和*/界定,不能跨行)。
b) 请求输入测试程序名,键入程序名后自动开始词法分析并输出结果;
c) 输出结果为单词的二元式序列(样式见样板输出1和2);
d) 要求能发现下列词法错误和指出错误性质和位置:
非法字符,即不是SAMPLE字符集的符号;
字符常数缺右边的单引号(字符常数要求左、右边用单引号界定,不能跨行);
注释部分缺右边的界符*/(注释要求左右边分别用/*和*/界定,不能跨行)。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std;
int error[1024]; //记录出错行
int i = 0; //出错行数组下标
//---------------------------------------------------------------------------------------------------------------------
struct Node //表节点
{
int number;
char *str;
Node *next;
static int count;
};
int Node::count = 0;
Node* head = NULL;
Node* tail = NULL;
void insert (char* var) //插入表
{
int n = strlen(var);
Node::count++;
Node* s = new Node;
s->number = Node::count;
s->str = new char[n];
strcpy_s(s->str n+1 var);
if (!head)
{
head = s;
tail = s;
head->next = NULL;
tail->next = NULL;
}
else
{
tail->next = s;
tail = s;
tail->next = NULL;
}
}
int search (char *var)
{
Node* p = head;
while (p)
{
if (!_stricmp(p->str var)) break;
else p = p->next;
}
if (p) return p->number;
return 0;
}
//---------------------------------------------------------------------------------------------------------------------
char getWord (ifstream& infile) //从infile中读取一个字符
{
char word;
infile.get(word);
return word;
}
char ignoreSpace (ifstream& infile) //从infile中读取空格后的第一个字符
{
char word;
infile.get(word);
while (word == ‘ ‘) infile.get(word);
return word;
}
int Reserve (char* str) //判断是否是保留字
{
char* reserve[35] = {
“and“ “array“ “begin“ “bool“ “call“
“case“ “char“ “constant“ “dim“ “do“
“else“ “end“ “false“ “for“ “if“
“input“ “integer“ “not“ “of“ “or“
“output“ “procedure“ “program“ “read“ “real“
“repeat“ “set““stop“ “then“ “to“
“true“ “until“ “var“ “while“ “write“ };
for (int i = 0; i < 35; i++)
{
if (!(_stricmp(reserve[i] str))) return i + 1;
}
return 0;
}
int isChar (char ch)
{
if ((ch >= ‘a‘) && (ch <= ‘z‘) || (ch >= ‘A‘) && (ch <= ‘Z‘)) return 1;
return 0;
}
int isDigit (char ch)
{
if ((ch >= ‘0‘) && (ch <= ‘9‘)) return 1;
return 0;
}
int isOther (char ch)
{
if (isChar(ch)) return 0;
if (isDigit(ch)) return 0;
return 1;
}
void charAdd (char* str char ch)
{
int length = strlen(str);
str[length] = ch;
str[length + 1] = ‘\0‘;
}
char Retract(ifstream& infile)
{
infile.seekg(-1 ios::cur); //从当前文件指针读写位置向回退1个字节
return ‘\0‘;
}
void analyzer (ifstream& infile)
{
int line = 1; //记录行标
int n = 1; //格式控制
while (!infile.eof())
{
char buffer[1024] = ““; //缓存读入的字符
char ch = ignoreSpace (infile);
if (isChar (ch) || ch == ‘_‘)
{
while (isChar(ch) || isDigit(ch) || ch == ‘_‘)
{
charAdd (buffer ch);
ch = getWord (infile);
}
ch = Retract(infile);
if (Reserve(buffer)) //保留字
{
cout << “(“ << Reserve (buffer) << “-)\t\t“;
if ( n % 5 == 0) cout << endl ;
++n;
}
else//标识符
{
if (!search (buffer))
{
insert(buffer);
}
co
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7039 2008-10-21 14:53 Compiler\Compiler\Analyzer.cpp
文件 3646 2008-10-20 19:10 Compiler\Compiler\Compiler.vcproj
文件 1411 2008-11-02 22:29 Compiler\Compiler\Compiler.vcproj.YUE-T60.Administrator.user
文件 72013 2008-11-02 22:28 Compiler\Compiler\Debug\Analyzer.obj
文件 5332 2008-11-02 22:28 Compiler\Compiler\Debug\BuildLog.htm
文件 621 2008-11-02 22:28 Compiler\Compiler\Debug\Compiler.exe.intermediate.manifest
文件 67 2008-11-02 22:28 Compiler\Compiler\Debug\mt.dep
文件 232448 2008-11-02 22:28 Compiler\Compiler\Debug\vc90.idb
文件 233472 2008-10-21 19:45 Compiler\Compiler\Debug\vc90.pdb
文件 301 2008-10-20 19:14 Compiler\Compiler\q.txt
文件 568011 2008-10-21 14:53 Compiler\Compiler\Release\Analyzer.obj
文件 6010 2008-10-21 14:53 Compiler\Compiler\Release\BuildLog.htm
文件 616 2008-10-21 14:53 Compiler\Compiler\Release\Compiler.exe.intermediate.manifest
文件 67 2008-10-21 14:53 Compiler\Compiler\Release\mt.dep
文件 142336 2008-10-21 14:53 Compiler\Compiler\Release\vc90.idb
文件 208896 2008-10-21 14:53 Compiler\Compiler\Release\vc90.pdb
文件 129 2008-10-21 14:51 Compiler\Compiler\w.txt
文件 1928192 2008-11-02 22:29 Compiler\Compiler.ncb
文件 890 2008-10-20 17:24 Compiler\Compiler.sln
..A..H. 8704 2008-11-02 22:29 Compiler\Compiler.suo
文件 46592 2008-11-02 22:28 Compiler\Debug\Compiler.exe
文件 440504 2008-11-02 22:28 Compiler\Debug\Compiler.ilk
文件 568320 2008-11-02 22:28 Compiler\Debug\Compiler.pdb
文件 129 2008-10-21 14:51 Compiler\Debug\w.txt
文件 14336 2008-10-21 14:53 Compiler\Release\Compiler.exe
文件 379904 2008-10-21 14:53 Compiler\Release\Compiler.pdb
文件 129 2008-10-21 14:52 Compiler\Release\w.txt
目录 0 2008-11-02 22:28 Compiler\Compiler\Debug
目录 0 2008-10-21 14:53 Compiler\Compiler\Release
目录 0 2008-10-21 14:53 Compiler\Compiler
............此处省略6个文件信息
- 上一篇:单片机控制74ls164程序
- 下一篇:简易绘图程序(计算机图形学课程设计)
相关资源
- 电梯模拟程序C/C 算法实现
- vs2005骑士巡游问题-分治法C
- 操作系统实验综合设计【附代码】
- 学生成绩管理系统C 源码(很完整)
- 基于C 的简易FTP客户端(带源码)
- 选课系统c (指针与链表)
- C (MFC)华容道自动求解
- VC 编程实现活动主机扫描源代码
- c 做的漂亮菜单附有源代码
- C 练习系列1
- 将数字转为中文金额的大写方式(C
- 十六进制与字符串互转
- 操作系统课程设计实现可变分区存储
- VC 使用GDI 矢量绘图软件源代码
- c 编写的 矩阵 matrix 类源码
- c 面试题(面试经验)自己收集自己
- vc 编写的基于TCP协议的客户/服务器
- 表达式求值C 代码(附实验报告)
- lzw压缩,解压缩算法
- 建立文件数据索引的c 代码
- 树状导航菜单的制作
- VC工程转Qt工程文件的工具
- Gerber文件的编辑程序
- 音频测试文件pcmmp3aacamrg711ag711u等多种
- 编译好的json_lib.lib 包含64位,32位,头
- 招商银行信用卡中心2018春招IT笔试数
- FFmpeg和SDL,读内存中的视频流,进行
- 车牌检测训练正样本,共1350张
- 是男人就下一百层
- vs2010 ffmpeg实时解码h264码流
评论
共有 条评论