資源簡介
本程序實現一個分析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客戶端的代碼
評論
共有 條評論