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