资源简介
c++ 编译原理 词法分析 算术表达式 语法分析

代码片段和文件信息
//:LexicalAnalyzer.cpp
//编译原理第一阶段:词法分析
//{L}syntacticAnalyzer.h
#include “syntacticAnalyzer.h“
#include
#include
#include
#include
#include
using namespace std;
#define PR(arg1 arg2) \
cout<<“( “<
vector vline;//存放未处理的一行行句子
vector vword;//存放以分组的词
vector vnum;//存放整数
vector vide;//存放标识符
vector vid;//存放类别
vector vvalue;//存放属性
int id;//类别
class LAResult
{
public:
int id;
int value;
public:
LAResult();
LAResult(int idd int val);
output();
};
LAResult::LAResult(int idd int val)
{
id = idd;
value = val;
}
LAResult::LAResult()
{
id = -1;
value = -1;
}
LAResult::output()
{
PR(id value);
}
//判断空格
bool isSpace(char c)
{
if(c == 32)
return true;
return false;
}
//判断字符
bool isLet(char c)
{
if((c>=65 && c<=90) ||(c>=97 &&c<=122))
return true;
return false;
}
//判断数字
bool isNum(char c)
{
if(c>=48 && c<=57)
return true;
return false;
}
//判断界符和算符
bool isOpOrSep(char c)
{
if((c>=40 && c<=45) || (c==47) ||(c>=59 &&c<=62) || (c==123) || (c==125))
return true;
return false;
}
//返回种别id
int getId(string s)
{
//运算符
if(s==“+“)
return 0;
else if(s==“-“)
return 1;
else if(s==“*“)
return 2;
else if(s==“/“)
return 3;
else if(s==“=“)
return 4;
else if(s==“==“)
return 5;
else if(s==“>“)
return 6;
else if(s==“>=“)
return 7;
else if(s==“<“)
return 8;
else if(s==“<=“)
return 9;
//界符
else if(s==“(“)
return 10;
else if(s==“)“)
return 11;
else if(s==“{“)
return 12;
else if(s==“}“)
return 13;
else if(s==“;“)
return 14;
else if(s==““)
return 15;
//关键字
else if(s==“main“)
return 16;
else if(s==“int“)
return 17;
else if(s==“char“)
return 18;
else if(s==“string“)
return 19;
else if(s==“void“)
return 20;
else if(s==“while“)
return 21;
else if(s==“for“)
return 22;
else if(s==“if“)
return 23;
else if(s==“else“)
return 24;
else if(s==“ifstream“)
return 25;
else if(s==“ofstream“)
return 26;
else if(s==“cout“)
return 27;
else if(s==“cin“)
return 28;
else if(s==“class“)
return 29;
else if(isNum(s[0]))//整数、只要字符串包含整数,此字符串就是整数串
return 31;
//标识符
return 30;
}
//词法分析
void analyzeLexical()
{
string word;
//判断并分词
for(int i = 0; i < vline.size(); i++)
{
int j = 0;
while(j {
//判断空格
while(isSpace(vline[i][j]))
{
j++;
}
//判断字母
if(isLet(vline[i][j]))
{
while(isLet(vline[i][j])||isNum(vline[i][j]))
{
word += vline[i][j];
j++;
}
}
if(word!=““)//如果word为空,则说明word没存入数据,则不向vector添加数据
{
vword.push_back(word);
word = ““;
continue;
}
//判断数字
while(isNum(vline[i][j]))
{
word += vline[i][j];
j++;
}
if(word!=““)//同上
{
vword.push_ba
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2014-04-17 13:47 编译器(1+2)\
目录 0 2014-04-17 13:47 编译器(1+2)\Compiler\
文件 4243 2014-03-11 19:08 编译器(1+2)\Compiler\Compiler.dsp
文件 524 2014-03-11 19:08 编译器(1+2)\Compiler\Compiler.dsw
文件 41984 2014-04-17 10:33 编译器(1+2)\Compiler\Compiler.ncb
文件 48640 2014-04-17 10:33 编译器(1+2)\Compiler\Compiler.opt
目录 0 2014-04-17 13:37 编译器(1+2)\Compiler\Debug\
文件 626770 2014-04-17 13:37 编译器(1+2)\Compiler\Debug\LexicalAnalyzer.exe
文件 1110920 2014-04-17 13:37 编译器(1+2)\Compiler\Debug\LexicalAnalyzer.ilk
文件 413858 2014-04-17 13:19 编译器(1+2)\Compiler\Debug\LexicalAnalyzer.obj
文件 186920 2014-04-17 10:40 编译器(1+2)\Compiler\Debug\LexicalAnalyzer.pch
文件 1434624 2014-04-17 13:37 编译器(1+2)\Compiler\Debug\LexicalAnalyzer.pdb
文件 152956 2014-04-17 13:37 编译器(1+2)\Compiler\Debug\syntacticAnalyzer.obj
文件 107520 2014-04-17 13:46 编译器(1+2)\Compiler\Debug\vc60.idb
文件 143360 2014-04-17 13:37 编译器(1+2)\Compiler\Debug\vc60.pdb
文件 7107 2014-04-17 13:19 编译器(1+2)\Compiler\LexicalAnalyzer.cpp
文件 3655 2014-04-17 10:38 编译器(1+2)\Compiler\LexicalAnalyzer.dsp
文件 538 2014-03-12 19:18 编译器(1+2)\Compiler\LexicalAnalyzer.dsw
文件 50176 2014-04-17 13:47 编译器(1+2)\Compiler\LexicalAnalyzer.ncb
文件 48640 2014-04-17 13:47 编译器(1+2)\Compiler\LexicalAnalyzer.opt
文件 264 2014-04-17 13:46 编译器(1+2)\Compiler\LexicalAnalyzer.plg
文件 2445 2014-04-17 13:37 编译器(1+2)\Compiler\syntacticAnalyzer.cpp
文件 81 2014-04-17 11:05 编译器(1+2)\Compiler\syntacticAnalyzer.h
文件 79 2014-04-17 13:46 编译器(1+2)\Compiler\待处理代码段.txt
文件 601 2014-04-17 13:46 编译器(1+2)\Compiler\词法分析结果.txt
文件 420 2014-03-11 21:28 编译器(1+2)\Compiler\词法规则对照.txt
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 编译原理c语言编译器
- 编译原理实验-词法分析(c语言代码)
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
评论
共有 条评论