资源简介
手工构造一个能够识别 C语言的所有典型单词,如:标识符、数字、运算
符,和 if、while 等保留字的确定有限自动机,并写出对应该自动机的程
序;然后以一个简化的 C语言程序为输入文件,通过所设计的基于上述自
动机的词法分析程序获得输入文件中的各个单词及其内码对照表,并以文
件形式保存结果(也就是TOKEN序列) 。
代码片段和文件信息
#include
#include
#define HEAD_BEGIN 1
#define HEAD_END 2
#define layer_ID 3
#define BEGIN 4
#define ERROR 5
#include “lex.h“
#pragma once
#pragma warning(disable:4786)
#pragma warning(disable:4503)
using namespace std;
int lineno = 1;
void replaceRe(string &re);
ifstream reader;
ofstream writer;
vector< string> actionTable;
int check(char c);
struct ReItem
{
string id;
string re;
};
ReItem IdReTable[20];
///////////////////////////////////////////////////将正规式替换定义符号
void replaceRe(string &re1)
{
char c;
int j = 1;
string re;
int m = re1.length();
if(re1[0] == ‘{‘ && m != 1)
{
c = re1[j];
while(c != ‘}‘)
{
re += c;
j++;
c = re1[j];
}
for(int i = 0 ; i < 20; i++)
{
if(re == IdReTable[i].id)
{
re1 = IdReTable[i].re;
}
else
{
}
}
}
else
{
}
}
////////////////////////////////////检查用户所给的输入是否符合输入的要求
int check(char c)
{
c = reader.get();
switch(c)
{
case ‘{‘:return HEAD_BEGIN;
case ‘}‘:return HEAD_END;
case ‘$‘:return layer_ID;
default: reader.putback(c);
break;
}
return ERROR;
}
/////////////将正规式首先进行预处理,将[]运算符替换成()和|结合的形式
string recognizeRE(string RE)
{
string realRE;
for(int i=0;i {
if(RE[i]==‘\\‘)
{
realRE+=RE[i];
realRE+=RE[i+1];
++i;
continue;
}
else if(RE[i]==‘[‘)
{
realRE+=‘(‘;
++i;
while(RE[i]!=‘]‘)
{
if(RE[i]!=‘-‘)
{
realRE+=RE[i++];
realRE+=‘|‘;
}
else
{
for(char c=++RE[i-1];c {
realRE+=c;
realRE+=‘|‘;
}
++i;
}
}
realRE[realRE.size()-1]=‘)‘;
}
else realRE+=RE[i];
}
return realRE;
}
////////////////////////////////////////////在预处理中加入链接符号@
string expandConcat(string RE)
{
string expandedRE;
for(int i=0;i {
expandedRE+=RE[i];
if(RE[i]==‘\\‘)
{
i++;
expandedRE+=RE[i];
if(i+1 if(RE[i+1]==‘(‘||!isOperator(RE[i+1])||RE[i+1]==‘\\‘)
expandedRE+=‘@‘;
}
else if(RE[i]==‘*‘||RE[i]==‘)‘||!isOperator(RE[i]))
if(i+1 if(RE[i+1]==‘(‘||!isOperator(RE[i+1])||RE[i+1]==‘\\‘)
expandedRE+=‘@‘;
}
return expandedRE;
}
////////////////////////////////////////////将正规式转换为后缀表达式
string toSuffixRE(string RE)
{
stack tempStack;
string suffixRE;
for(int i=0;i {
if(RE[i]==‘\\‘)
{
suffixRE+=RE[i++];
suffixRE+=RE[i];
}
else if(RE[i]==‘*‘||RE[i]==‘|‘||RE[i]==‘@‘||RE[i]==‘(‘)
{
if(tempStack.empty())
tempStack.push(RE[i]);
else
{
char temp=tempStack.top();
while(isp(temp)>=icp(RE[i]))
{
suffixRE+=temp;
tempStack.pop();
if(!tempStack.empty())
temp=tempStack.top();
else break;
}
tempStack.push(RE[i]);
}
}
else if(RE[i]==‘)‘)
{
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2014-02-07 19:09 Course Project\
文件 14042 2014-01-01 14:13 Course Project\Lexical.cpp
文件 979 2014-01-01 14:14 Course Project\Lexical.h
文件 1673 2014-01-01 14:29 Course Project\define.h
文件 454 2014-01-01 14:09 Course Project\input.l
文件 6604 2014-01-01 14:29 Course Project\output.cpp
文件 52736 2014-01-01 14:09 Course Project\tessss.exe
目录 0 2014-02-07 19:08 Course Project\测试2输入复杂版\
文件 1673 2014-01-01 14:23 Course Project\测试2输入复杂版\define.h
文件 2275 2014-01-01 14:25 Course Project\测试2输入复杂版\input.l
文件 881808 2014-01-01 14:30 Course Project\测试2输入复杂版\output.cpp
文件 534016 2014-01-01 14:24 Course Project\测试2输入复杂版\tesss.exe
- 上一篇:VB.NET写的FFT算法
- 下一篇:控制台俄罗斯方块C++源码
相关资源
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 词法分析器有去除注释功能
- 自定义词法规则的词法分析器
- 简单函数绘图语言的解释器
- C语言词法分析程序
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析C++源码
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
评论
共有 条评论