资源简介
本程序实现一个分析C语言的词法分析+语法分析。
注意:
1.文法简略,没有实现的部分,可以在此文法的基础上进行扩充,本程序的采用自顶向下的LL(1)文法。
2.可以自动实现求First 集和 Follow 集。
3.处终结符外(有些硬编码的成分),终结符的文法可以自定义,也就是说读者可以自定义文法。
4.为方便理解,C语言的文法描述写成中文。
5.程序将词法分析和语法分析结合起来,词法分析的结果作为语法分析的输入。
6.最终结果在控制台显示的有:词法分析、First集、Follow集、Select集,在preciateResult.txt 中写入了语法分析结果,在preciateTable.txt 中写入了预测分析表。
7.文法的词素之间必须有空格分开。
代码片段和文件信息
//LexAnalysis.cpp
#include
#include
#include
#include
#include
#include
#include
#include “LexAnalysis.h“
using namespace std;
int leftSmall = 0;//左小括号
int rightSmall = 0;//右小括号
int leftMiddle = 0;//左中括号
int rightMiddle = 0;//右中括号
int leftBig = 0;//左大括号
int rightBig = 0;//右大括号
int lineBra[6][1000] = {0};//括号和行数的对应关系,第一维代表左右6种括号
int static_iden_number = 0;//模拟标志符的地址,自增
//Token节点
NormalNode * normalHead;//首结点
//错误节点
struct ErrorNode
{
char content[30];//错误内容
char describe[30];//错误描述
int type;
int line;//所在行数
ErrorNode * next;//下一个节点
};
ErrorNode * errorHead;//首节点
//标志符节点
struct IdentiferNode
{
char content[30];//内容
char describe[30];//描述
int type;//种别码
int addr;//入口地址
int line;//所在行数
IdentiferNode * next;//下一个节点
};
IdentiferNode * idenHead;//首节点
vector > keyMap;
vector > operMap;
vector > limitMap;
//初始化C语言的关键字的集合
void initKeyMapping()
{
keyMap.clear();
keyMap.push_back(make_pair(“auto“AUTO));
keyMap.push_back(make_pair(“break“BREAK));
keyMap.push_back(make_pair(“case“CASE));
keyMap.push_back(make_pair(“char“CHAR));
keyMap.push_back(make_pair(“const“CONST));
keyMap.push_back(make_pair(“continue“CONTINUE));
keyMap.push_back(make_pair(“default“DEFAULT));
keyMap.push_back(make_pair(“do“DO));
keyMap.push_back(make_pair(“double“DOUBLE));
keyMap.push_back(make_pair(“else“ELSE));
keyMap.push_back(make_pair(“enum“ENUM));
keyMap.push_back(make_pair(“extern“EXTERN));
keyMap.push_back(make_pair(“float“FLOAT));
keyMap.push_back(make_pair(“for“FOR));
keyMap.push_back(make_pair(“goto“GOTO));
keyMap.push_back(make_pair(“if“IF));
keyMap.push_back(make_pair(“int“INT));
keyMap.push_back(make_pair(“long“LONG));
keyMap.push_back(make_pair(“register“REGISTER));
keyMap.push_back(make_pair(“return“RETURN));
keyMap.push_back(make_pair(“short“SHORT));
keyMap.push_back(make_pair(“signed“SIGNED));
keyMap.push_back(make_pair(“sizeof“SIZEOF));
keyMap.push_back(make_pair(“static“STATIC));
keyMap.push_back(make_pair(“struct“STRUCT));
keyMap.push_back(make_pair(“switch“SWITCH));
keyMap.push_back(make_pair(“typedef“TYPEDEF));
keyMap.push_back(make_pair(“union“UNION));
keyMap.push_back(make_pair(“unsigned“UNSIGNED));
keyMap.push_back(make_pair(“void“VOID));
keyMap.push_back(make_pair(“volatile“VOLATILE));
keyMap.push_back(make_pair(“while“WHILE));
keyMap.push_back(make_pair(“describe“DESCRIBE));
keyMap.push_back(make_pair(“type“TYPE));
keyMap.push_back(make_pair(“string“STRING));
keyMap.push_back(make_pair(“digit“DIGIT));
}
void initOperMapping()
{
operMap.clear();
operMap.push_back(make_pair(“!“NOT))
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2002 2015-06-16 10:43 c语言语法分析\change.log
文件 32189 2015-06-16 10:41 c语言语法分析\LexAnalysis.cpp
文件 4386 2015-06-16 10:39 c语言语法分析\LexAnalysis.h
文件 588 2015-06-16 10:44 c语言语法分析\readme.txt
文件 37355 2015-06-16 10:42 c语言语法分析\SynAnalysis.cpp
文件 523 2015-06-16 10:39 c语言语法分析\SynAnalysis.h
目录 0 2015-06-16 10:44 c语言语法分析
----------- --------- ---------- ----- ----
77043 7
- 上一篇:词法分析程序设计与实现
- 下一篇:vc实现的telnet客户端的代码
评论
共有 条评论