C++实现3型文法转换词法生成器

C++实现3型文法转换词法生成器

原理

本质是就是一个带权有向图的深度遍历

3型文法 :状态1/状态2/转换条件

比如

在这里插入图片描述
例子:

0/1/letter
1/1/letter
1/2/idother
1/1/digital
建立状态图:
在这里插入图片描述

到终态时我们查表可知结果了
比如输入 int a;


此时查表发现int是关键字

如何走入下个状态呢?答案就是深度遍历

对于后续识别都是一样的方式,都是从初态看这个字符能进入哪个状态

代码:

#include <iostream>
#include <cstring>
#include <vector>
#include <fstream>
#include <algorithm>

#define MAXVERTEXNUM 20

//状态表 
#define START 0
#define KEY_ID 2
#define DELIMITER 3
#define OPERATORPREV 4 
#define DIGITALPREV 5
#define DIGITAL 6
#define UNARY_OPERATOR 8
#define BINOCULAR_OPERATOR 7

using namespace std;
//为什么要这样做?
struct tokenList{
   
	int lineNumber;
	string tokenClass;
	string content;
};

typedef int Vertex;

struct Principle{
   
	char initialState;
	char finalState;
	string action;
};
typedef struct ENode *PtrToENode;
struct ENode {
   
		//     v1/v2/action 
	Principle v1_v2_action;
};
typedef struct AdjVNode *PtrToAdjVNode; 
struct AdjVNode {
   
	Vertex AdjV; /* 邻接点下标 */
	vector<string> actions;
	PtrToAdjVNode Next;
	bool isVisit;
	
};
typedef PtrToENode Edge;
struct DataType{
   
	bool isVisit;
	int index;
};
typedef struct Vnode{
   
	PtrToAdjVNode FirstEdge;
	DataType data; /* 存顶点的数据 */
} AdjList[MAXVERTEXNUM]; 
typedef struct GNode *PtrToGNode;
struct GNode {
    
	int Nv; /* 顶点数 */
	int Ne; /* 边数 */
	AdjList G; /* 邻接表 */
};
typedef PtrToGNode LGraph;

int vertexNum=0,edgeNum=0;
LGraph graph;


/
vector<tokenList> tl;
tokenList tempTL;
vector<int> lineNumArray;
int curLineNum=1;



 
char sourceCode[1000]={
   '\0'};
string mybuf="";
int codeIndex=0;
vector<Principle> vp; 

vector<string> mykey={
   
"int","double","return","if","char","string","for","break","using","namespace"
};
vector<char> idOther={
   
' ',';','=','(',')','+','-','*','/','=','<','>',',',
};
vector<char> digitalOther={
   
';',')','(',' ',','
};
vector<char> operatorOther={
   
'0','1','2','3','4','5','6','7','8','9',' ',';',')','(',' ',','
};
vector<char> limiter={
   
';','[',']','{','}','(',')'
};

vector<char> digitFirst={
   
'0','1','2','3','4','5','6','7','8','9'
};
vector<char> digitSecond={
   
'0','1','2','3','4','5','6','7','8','9','E','e','.','+','-','i'
};
vector<char> myOperator={
   
'+','-','*','/','=','<','>'
};

//建立状态图
bool isLinked(Vnode &v1_head,Edge E
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值