资源简介
本程序实现一个分析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客户端的代码
相关资源
- 实现语法分析器-编译原理
- 语法分析器 tiny语言语法分析
- C++语法分析器
- LL1语法分析器(c++)
- 编译原理课程设计----语法分析器(
- 编译原理课程实验报告词法分析器及
- PL0编译器词法检查与语法分析器
- LL(1)语法分析器C++版
- LR(0)语法分析器程序
- 编译原理课程设计词法语法分析器
- 编译原理LL1语法分析器C++版源代码
- 编译原理课程设计LR(0)语法分析器
- 编译原理实验语法分析器
- cminus语法分析器源代码完整版
- 基于算符优先分析方法的表达式语法
- 基于预测分析方法的表达式语法分析
- c++源码C-语法分析器源代码
- PL0语法分析器(递归子程序法)
- 编译原理实践:C++实现语法分析器.
- 预测分析语法分析器(c++源代码)
- 编译原理-语法分析器C语言源码
- 用C语言变的语法分析器
- 递归下降语法分析器C++实现
- 编译原理 LL1语法分析器
- 编译原理语法分析器SLR(1)
- 简单的c语言语法分析器
- 词法分析C语言源代码附实验报告
- 语法分析器C语言源代码附实验报告
- 递归下降分析法实现LL(1)文法的语
- 编译原理实验c++实现LR(1)语法分析
评论
共有 条评论