编译原理实验(Tiny+语法分析)

更新时间:2023-08-25 12:34:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

TINY+语言的语法分析软件

软件设计说明文档

院系 计算机学院 专业 计算机科学与技术 年级 2008级 班级 2班 姓名 张俊发 学号实验名称 综合利用多媒体制作网站或者应用程序 实验时间 5月1日至25 日 指导老师及职称 黄煜廉

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

1.总体描述

1.1总体功能概述

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

1.2设计目标

设计目标:

(1) 扩充的语法规则有:

While-stmt --> while exp do stmt-sequence endwhile Dowhile-stmt-->do stmt-sequence while exp

for-stmt-->for identifier:=simple-exp to simple-exp do stmt-sequence enddo 步长递增1

for-stmt-->for identifier:=simple-exp downto simple-exp do stmt-sequence enddo 步长递减1

软件能对Tiny+语言源程序进行语法分析并生成语法树。

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

(1)要提供一个源程序编辑界面,以让用户输入源程序(可保存、打开源程序)

(2)可由用户选择是否生成语法树,并可查看所生成的语法树。

1.3 软件总体结构

本软件包括下面3个功能模块:词法分析功能模块;语法分析功能模块; 文本编辑模块;

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

2.软件功能设计

2.1 软件功能界面:

2.2词法分析模块功能设计 2.2.1 功能描述

对输入源程序进行扫描,识别Tiny+记号。

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

2.2.2功能设计

Tiny+语言扫描程序DFA图如下:

2.2.3代码实现

Scan:这部分的功能的核心函数是 getToken()函数。

MyTokenType Scan::getToken(void) {

int tokenStringIndex = 0; MyTokenType currentToken; StateType state = START; int save;

while(state!=DONE){ int c = getNextChar(); save = TRUE; switch(state){ case START: if ( isdigit(c) ) state = INNUM; else if ( isalpha(c) ) state = INID; else if ( c == ':' ) state = INASSIGN;

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

else if (c == '{'){ save = FALSE; state = INCOMMENT; }else{ state=DONE; switch(c){ case EOF:save = FALSE;currentToken = MYENDFILE;break; case '=':currentToken = EQ;break; case '<':currentToken = LT;break; case '+':currentToken = PLUS;break; case '-':currentToken = MINUS;break; case '*':currentToken = TIMES;break; case '/':currentToken = OVER;break; case '%':currentToken = MOD;break; case '(':currentToken = LPAREN;break; case ')':currentToken = RPAREN;break; case ';':currentToken = SEMI;break; default:currentToken = MYERROR;break; } }break;

case INCOMMENT:save = FALSE; if (c == EOF){ state = DONE; currentToken = MYENDFILE; }else if (c == '}') state = START; break;

case INASSIGN:state = DONE; if (c == '=') currentToken = ASSIGN; else{ /* backup in the input */ ungetNextChar(); save = FALSE; currentToken = MYERROR; }break;

case INNUM:if (!isdigit(c)){ /* backup in the input */ ungetNextChar(); save = FALSE; state = DONE; currentToken = NUM; }break;

case INID:if (!isalpha(c)){ /* backup in the input */ ungetNextChar(); save = FALSE; state = DONE; currentToken = ID;

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

}

case DONE: default: /* should never happen */ fprintf(listing,"Scanner Bug: state= %d\n",state); state = DONE; currentToken = MYERROR;break; } if ((save) && (tokenStringIndex <= MAXTOKENLEN)) tokenString[tokenStringIndex++] = (char) c; if (state == DONE){ tokenString[tokenStringIndex] = '\0'; if (currentToken == ID) currentToken = reservedLookup(tokenString);} }

fprintf(listing,"\t%d: ",lineno); printToken(currentToken); return currentToken;

2.3词法分析模块功能设计 2.3.1 功能描述

TINY+语言文法:

program --> stmt-sequence

stmt-sequence --> statement {;statement}

statement --> if-stmt|repeat-stmt|assign-stmt|read-stmt|write-stmt |While-stmt|Dowhile-stmt|for-stmt

if-stmt --> if exp then stmt-sequence [else stmt-sequence] end repeat-stmt --> repeat stmt-sequence until exp assign-stmt --> identifier := exp read-stmt --> read identifier write-stmt --> write exp

exp --> simple-exp [ comparison-op simple-exp ] comparison-op --> < | =

simple-exp --> term { addop term } addop --> + | -

term --> factor { mulop factor } mulop --> * | / | %

factor --> (exp) | number | identifier

While-stmt --> while exp do stmt-sequence endwhile Dowhile-stmt --> do stmt-sequence while exp

for-stmt --> for identifier := simple-exp for-choose' for-choose' --> to simple-exp do stmt-sequence enddo for-choose' --> downto simple-exp do stmt-sequence enddo

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

根据Tiny+文法对输入的Tiny+源程序进行语法分析,并生成语法树。

2.3.2功能设计

Tiny+语言语法图如下:

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

2.2.3代码实现

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

扩充文法实现:

TreeNode * Parse::while_stmt(void) { TreeNode * t=newStmtNode(WhileK); match(WHILE); if(t!=NULL)t->child [0]=exp(); match(DO); if(t!=NULL)t->child [1]=stmt_sequence(); match(ENDWHILE); return t; }

TreeNode * Parse::dowhile_stmt(void) { TreeNode * t=newStmtNode(DowhileK); match(DO); if(t!=NULL)t->child [0]=stmt_sequence(); match(WHILE); if(t!=NULL)t->child [1]=exp(); return t; }

TreeNode * Parse::for_stmt(void) { TreeNode * t=newStmtNode(ForIncK); match(FOR); if(t!=NULL) { t->child [0]=assign_stmt(); if(token==TO) match(TO); else if(token==DOWNTO) { match(DOWNTO); t->kind.stmt =ForDecK; }

t->child [1]=simple_exp(); match(DO); t->child [2]=stmt_sequence(); match(ENDDO); } return t; }

TINY+语言的语法分析软件提供Window界面,用户可以点击【打开】按钮打开或者在编辑框中输入一个扩展Tiny+语言源程序;通过【打印语法树】复选按钮可以选择在分析结果中打印语法树,【语法分析】按钮提供Tiny语言词法分析功能,对源程序进行语法分析后在内存中生成语法树,并将分析结果显示在编辑框中;【文件另存为】按钮可以保存文件。

3.软件功能展示

分析结果:

本文来源:https://www.bwwdw.com/article/w8qi.html

Top