西南交通大学 编译原理课程设计(C语言词法分析器 C语言语法分析器)丁光耀

2026/1/25 3:16:09

} }

if(isVT&&isNull) //处理像E->ABaβ的产生式的情况 AddChar(select[i],proNode[i].rightSym[j]); if(j == proNode[i].length) {

//若α=X1X2 ? Xnα′,其中Xi∈VN , 1≤i≤n; //若对于一切1≤i≤n,ε∈FIRST(Xi),则将follow(α)加入select集合

int leftSymLoc = GetUTLoaction(UnTerminate,proNode[i].leftSym);

AddCharToChar(select[i],unTInfo[leftSymLoc].follow); } } } }

void SetSheet(ProNode proNode[],UnTInfo unTInfo[]) { //构造分析表 int selLen ;

int rowLoc,colLoc;

for(int i = 0; i < proNum ; i++) { selLen = strlen(select[i]);

for(int j = 0 ; j < selLen ; j++) {

rowLoc = GetUTLoaction(UnTerminate,proNode[i].leftSym); colLoc = GetTLocaction(Terminate,select[i][j]); sheet[rowLoc][colLoc] = proNode[i]; } } }

void InputSym() { //输入字符串函数 InitQueue(Remain);

cout<<\请输入要分析的字符串(以'#'结束):\ char tmpChar; int i = 0 ;

cin>>tmpChar;

while(tmpChar != '#') {

EnQueue(Remain,tmpChar); cin>>tmpChar; }

EnQueue(Remain,tmpChar); }

void Scan() { //分析扫描的主控程序 int i = 0 ; int step = 1; int rightLoc; int leftLoc; char a; char x;

bool flag = true; //SymStack[i] = '#';

//SymStack[++i] = UnTerminate[0]; //'#' 、开始符号入栈 //SqStack s;

SqStack SymStack; //符号栈 InitStack(SymStack);

cout<<\步骤\符号栈\读入符号\剩余符号串\使用产生式\

25

cout<

Push(SymStack,UnTerminate[0]); //'#' 、开始符号入栈 PrintSym(SymStack);

a = GetSym(Remain); //读入第一个符号 cout<

PrintRemain(Remain);

x = Pop(SymStack); //从栈中弹出符号 leftLoc = GetUTLoaction(UnTerminate,x); rightLoc = GetTLocaction(Terminate,a); PrintSheet(leftLoc,rightLoc); cout<<\

if(IsTerminate(x)){ if(x == a) {

a = GetSym(Remain); cout<

flag = false; Error(); } }

else if(x == '#') {

if(x == a) { //分析成功 Success(); flag = 0 ; } else {

flag = 0 ; Error(); } } else

if(sheet[GetUTLoaction(UnTerminate,x)][GetTLocaction(Terminate,a)].leftSym \\ != '\\0' ) { // X ∈Vn查分析表 //Pop(SymStack);

leftLoc = GetUTLoaction(UnTerminate,x); rightLoc = GetTLocaction(Terminate,a);

if(sheet[leftLoc][rightLoc].rightSym[0] != '^') {

//若X1X2?Xn != ε,则反顺序进栈 int rightLen strlen(sheet[leftLoc][rightLoc].rightSym);

for(int i = rightLen - 1; i >=0 ; i--) { Push(SymStack,sheet[leftLoc][rightLoc].rightSym[i]); }

cout<

cout<

26

=

cout<

flag = 0; Error(); } } }

char GetSym(LinkQueue &q) {

if(q.front == q.rear) return NULL;

QueuePtr p = (QueuePtr)malloc(sizeof(QNode)); p = q.front->next; char tmp = p->data; q.front->next = p->next;

if(q.rear == p) q.rear = q.front; free(p); return tmp; }

void PrintSym(SqStack &s) { //显示符号栈 符号 char* i ;

for( i = s.base ; i < s.top;i++) cout<<*i; cout<<\ }

void PrintRemain(LinkQueue &q) { //显示剩余符号串 QueuePtr d ; char tmp;

if(q.front->next != NULL) { d =q.front->next; do {

tmp = d->data; cout<next; }while(tmp != '#'); cout<<\ }

else return ; }

void PrintSheet(int row,int col) { //显示所使用产生式 if(row != -1 && col != -1) {

cout<

cout<<\ }

void Success() {//分析成功

cout<<\ }

2.6 结果分析

27

我将如下产生式放入xuyusong.txt文件中 E->TA; A->+TA; A->-TA; A->^; T->FB; B->*FB; B->/FB; B->^; F->PC; C->*F; C->^; P->(E); P->i;#

注:放入文件中不能有回车符号,我这为了能够让读者清除的看到产生式,在源文件基础上加了回车符号。”^”代表空字。

以上文法是为了实现四则运算和指数运算的文法。

如图2.1 我将产生式输出到控制台上,并将生成的LL(1)表也一并输出到了控制台。

图 2.1

28


西南交通大学 编译原理课程设计(C语言词法分析器 C语言语法分析器)丁光耀.doc 将本文的Word文档下载到电脑
搜索更多关于: 西南交通大学 编译原理课程设计(C语言词法分析器 C语言语法 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219