• 大小: 15KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-09-27
  • 语言: C/C++
  • 标签:

资源简介

本程序实现一个分析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


评论

共有 条评论