合肥工业大学编译原理实验
编译原理实验报告:实验一编写词法分析程序.

编译原理实验报告实验名称:实验一编写词法分析程序实验类型:验证型实验指导教师:何中胜专业班级:13软件四姓名:丁越学号:13030504电子邮箱:862245792@实验地点:秋白楼B720实验成绩:日期:2016年3 月18 日一、实验目的通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。
掌握文法转换成自动机的技术及有穷自动机实现的方法。
确定词法分析器的输出形式及标识符与关键字的区分方法。
加深对课堂教学的理解;提高词法分析方法的实践能力。
通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。
2、掌握词法分析的实现方法。
3、上机调试编出的词法分析程序。
二、实验过程以编写PASCAL子集的词法分析程序为例1.理论部分(1)主程序设计考虑主程序的说明部分为各种表格和变量安排空间。
数组 k为关键字表,每个数组元素存放一个关键字。
采用定长的方式,较短的关键字后面补空格。
P数组存放分界符。
为了简单起见,分界符、算术运算符和关系运算符都放在 p表中(编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。
id和ci数组分别存放标识符和常数。
instring数组为输入源程序的单词缓存。
outtoken记录为输出内部表示缓存。
还有一些为造表填表设置的变量。
主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。
主程序的工作部分设计成便于调试的循环结构。
每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。
⑵词法分析过程考虑将词法分析程序设计成独立一遍扫描源程序的结构。
其流程图见图1-1。
图1-1该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。
编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
编译原理课程设计

课 程 设 计将算术表达式转换成四元式的程序实现 康海潇20062421计算机科学与技术2班 王仲宾2008 年 12 月设计题目 学 号 专业班级 学生姓名指导教师合肥工业大学课程设计任务书目录第一章概述 (4)1.1设计内容 (4)1.2设计要求 (4)第二章设计的基本原理 (4)第三章程序设计 (6)3.1总体方案设计 (6)3.2各模块设计 (6)第四章程序测试 (7)...第五章结论 (7)附录程序清单 (8)第一章概述1.1设计内容:设计一个语法制导翻译器,将算术表达式翻译成四元式。
1.2设计要求:先确定一个定义算术表达式的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。
对用户输入的任意一个正确的算术表达式,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。
第二章设计的基本原理四元式是一个带有四个域的记录结构,这四个域分别成为op,arg1,arg2及result。
域op包含一个代表运算符的内部码。
三地址语句x:=y op z可表示为:将y置于arg1域,z置于arg2域,x置于result域,:=为算符。
带有一元运算符的语句如x:=-y或x:=y的表示中不用arg2.而像param这样的运算符仅使用arg1域。
条件及无条件转移语句将目标标号置于result域中。
赋值语句a:=b*-c+b*-c的四元式表示为:op arg1 arg2 result(0) uminus c _ T1(1) * b T1 T2(2) uminus c _ T3(3) * b T3 T4(4) + T2 T4 T5(5) := T5 _ a通常四元式的arg1,arg2 和result 的内容都是一个指针,此指针指向有关名字的符号表入口。
这样临时变量名也要填入符合表。
本程序用c++语言编写,用一个string类型的数据存储读入的式子,由于要求读入算术表达式,所以输入为标准的算术表达式,如有负值则必须用括号括起来,格式如下:x=a+c×(e×(-d)).所用到的产生式为:E->E+E|E*E|E-E|E/E|(E)|(F)|i|ε;F->-i;通过这个产生式可以得到任意一个算术表达式。
Removed_合肥工业大学编译原理实验 LL(1)分析法

if(c==Vt[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中 } void addfi(String s, int j){//求关于某一个产生式的 first 集 int v=vn(s.charAt(0));//v 为产生式左边的非终结符 int i; if(vt(s.charAt(j))!=-1){//产生式右边第一个为终结符
fi[v][vt(s.charAt(j))]=true;//就把 s.charAt(j)加入 s.charAt(0)的 first 集
}else{//产生式右边第一个为非终结符 if(!fi[vn(s.charAt(j))][Vt.length]){//如果 s.charAt(j)的
first 集没有求,先求 s.charAt(j)的 first 集 first(s.charAt(j));
int vn(char c){//返回 c 在非终结符表中的位置 int i; for(i=0;i<Vn.length;i++){ if(c==Vn[i])return i;//在表中,就返回位置 } return -1;//返回-1 表示不在表中
} int vt(char c){//返回 c 在终结符表中的位置
4、算法流程图
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
编译原理:第一章 引论

常见的表格:符号名表,常数表,标号表,入 口名表,过程引用表。 格式:
名字
信息
合肥工业大学 计算机与信息学院软件所
例: PASCAL程序段:
PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR K:INTEGER; BEGIN START: K:=M+1; M:=N+4; N:=K; END.
合肥工业大学 计算机与信息学院软件所
5. 目标代码产生
任务: 把中间代码变换成特定机器上的目标 代码。 依赖于硬件系统结构和机器指令的含义 目标代码三种形式:
绝对指令代码: 可直接运行 可重新定位指令代码: 需要连接装配 汇编指令代码: 需要进行汇编
合肥工业大学 计算机与信息学院软件所
合肥工业大学 计算机与信息学院软件所
4. 优化
任务:对于前阶段产生的中间代码进行加工变 换,以期在最后阶段产生更高效的目标代码。 主要包括:公共子表达式提取、合并已知量、 删除无用语句、循环优化等。 依循的原则:程序的等价变换规则
FOR K:=1 TO 100 DO BEGIN X:=I+1; M := I + 10 * K; N := J + 10 * K; END
合肥工业大学 计算机与信息学院软件所
语法分析举例说明
C语言程序 Void jisuan() { int y,c,d; float x,a,b; x=a+b*50; y=c+)d*(x+b; } 现在我们对x=a+b*50; 进行语 法分析。
赋值语句的语法 规则: A V=E E T|E+T T F|T*F F V|(E)|C V 标识符 C 常数
合肥工业大学编译原理实验

宣城校区实验报告课程名称编译原理专业班级计算机0001班学生姓名及学号赵保飞 68指导教师李芒宏实验地点计算机中心楼第四机房2017 ~2018 学年第一学期《编译原理》课程实验报告实验名称词法分析设计姓名赵保飞系院专业计算机科学与技术班级计算机01班学号68实验日期指导教师李芒宏成绩一、实验目的和要求通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。
二、实验原理(1)实验数据结构说明K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符(2)实验算法描述(3)算法流程图三、源程序代码和测试结果package lexicalAnalysis;import.*;import.*;public class lexicalAnalysis{static Stringk[]={"for","main","if","while","void","public","static","printf","scanf","asm","do","return","typedef","auto","double","break", "short","using","default","long"};ength()==1){quals(b))){display(4,r[i],' ');ength()==2){quals(a))){display(4,r[i],' ');;import.*;import WinGrid extends JFrame{GridLayout grid;JPanel chessboard;JTextField text;JTextArea textShow;JButton button;ReaderListen listener;WinGrid(){init();setVisible(true);setDefaultCloseOperation;}void init(){setLayout(new FlowLayout());text=new JTextField(10);setBounds(466,166,500,400);button=new JButton("读取");textShow=new JTextArea(9,30);listener=new ReaderListen();(text);(textShow);(listener);(listener);add(text);add(button);add(new JScrollPane(textShow));}}class ReaderListen implements ActionListener{JTextField text;JTextArea textShow;LL one=new LL();String s;String temp1[][]=new String[18][6];public void setJTextField(JTextField text){=text;}public void setJTextArea(JTextArea textShow){=textShow;}public String S(){String t=();return t;}@Overridepublic void actionPerformed(ActionEvent e){try{String s=()+"#";(s+"\n");("步骤"+"\t"+"分析栈"+"\t"+"剩余输入串"+"\t"+"所用产生式"+"\t"+"动作"+"\n");(s,temp1);for(int i=0;i<18;i++){for(int k=0;k<5;k++){(temp1[i][k]+"\t");}("\n");}}catch(Exception e2){();}}}public class exp3{public static void main(String[]args){;import.*;public class LL{char Vn[]={'E','T','G','F','S'};harAt(0);int k;if(vtNum(Gr[i].charAt(j))!=-1){harAt(j)!='ε'){harAt(j)不为ε时将s加到M[vn(u)][vt(Gr[i].charAt(j))]中M[vnNum(u)][vtNum(Gr[i].charAt(j))]=s;}else{harAt(j)为ε,将属于u的follow集的元素b的位置用s加到M[vn(u)][vt(b)]中if(FOLLOW[vnNum(u)][k]){M[vnNum(u)][k]=s;}}}}else{harAt(j)为非终结符for(k=0;k<;k++){harAt(j)的first集时,将s加到M[vn(u)][vt(a)]中if(FIRST[vnNum(Gr[i].charAt(j))][k]){M[vnNum(u)][k]=s;}}if(FIRST[vnNum(Gr[i].charAt(j))][vtNum('ε')]){harAt(j)的first集时,将属于u的follow集的b将s加到M[vn(u)][vt(b)]中if(j==m-1){for(k=0;k<;k++){if(FOLLOW[vnNum(u)][k])M[vnNum(u)][k]=s;}}else{j=j+1;MM(j,i,s,m);}}}}void buildM(){ength()){m=or(j,Gr[i]);if(m==-1){m=Gr[i].length();}s=Gr[i].substring(j,m);oString());}tempp[k][1]=temp0_string;tempp[k][2]=(i); tempp[k][3]=rule; tempp[k][4]=();v=();action="pop";if(vnNum(v)!=-1){left = 'E';strcpy(s_have[1].sright, "E+T");left = 'E';strcpy(s_have[2].sright, "T");left = 'T';strcpy(s_have[3].sright, "T*F");left = 'T';strcpy(s_have[4].sright, "F");left = 'F';strcpy(s_have[5].sright, "(E)");left = 'F';strcpy(s_have[6].sright, "i");ove[0] = 5;action[0].move[3] = 4;action[1].move[1] = 6;action[2].change[1] = 2;action[2].move[2] = 7;action[2].change[4] = 2;action[2].change[5] = 2;action[3].change[1] = 4;action[3].change[2] = 4;action[3].change[4] = 4;action[3].change[5] = 4;action[4].move[1] = 5;action[4].move[3] = 4;action[5].change[1] = 6;action[5].change[2] = 6;action[5].change[4] = 6;action[5].change[5] = 6;action[6].move[0] = 5;action[6].move[3] = 4;action[7].move[0] = 5;action[7].move[3] = 4;action[8].change[1] = 6;action[8].change[4] = 11;action[9].change[1] = 1;action[9].move[2] = 7;action[9].change[4] = 1;action[9].change[5] = 1;action[10].change[1] = 3;action[10].change[2] = 3;action[10].change[4] = 3;action[10].change[5] = 3;action[11].change[1] = 5;action[11].change[2] = 5;action[11].change[4] = 5;action[11].change[5] = 5;/*存储GOTO表*/go[0].head[0] = 'E';ead[1] = 'T';go[0].head[2] = 'F';go[0].gt[0] = 1;t[1] = 2;go[0].gt[2] = 3;go[4].head[0] = 'E';go[4].head[1] = 'T';go[4].head[2] = 'F';go[4].gt[0] = 8;go[4].gt[1] = 2;go[4].gt[2] = 3;go[6].head[1] = 'T';go[6].head[2] = 'F';go[6].gt[1] = 9;go[6].gt[2] = 3;go[7].head[2] = 'F';go[7].gt[2] = 10;ove[col] != 0){cout << "ACTION[" << sta << "," << symb << "]=" << "S" << action[sta].move[col] << ",PUSH" << action[sta].move[col] << endl;status[++sta_Index] = action[sta].move[col];hange[col] != 0){cout << "r" << action[sta].change[col] << ":" << s_have[action[sta].change[col]].sleft << "->"<< s_have[action[sta].change[col]].sright << "规约,GOTO(" << status[sta_Index - strlen(s_have[action[sta].change[col]].sright)] << ","<< s_have[action[sta].change[col]].sleft << ")=";int i = 0;for (i = 0; i < strlen(s_have[action[sta].change[col]].sright); i++)hange[col]].sleft;hange[col]].sright); i++)ead[i] == symb){status[++sta_Index] = go[sta].gt[i];cout<< go[sta].gt[i] << "PUSH" << endl;return;}}}/*查表*/void start_find(void){int s = status[sta_Index];char exp_first_char = inputstring[instr_top];char sym = symbol[sym_Index];while (IsAccept != 1){s = status[sta_Index];exp_first_char = inputstring[instr_top];sym = symbol[sym_Index];/*输出步骤*/cout << step++<<"\t\t";/*输出当前状态栈*/int i = 0;for (i = 0; i <= sta_Index; i++){cout<<status[i];}cout << "\t\t";/*输出符号栈*/cout << symbol << "\t\t";/*输出剩余的输入串*/i= 0;for (i = 0; i < instr_top; i++)cout<<" ";for (i = instr_top; i <= instr_index; i++){cout<<inputstring[i];}cout<<"\t\t";switch (exp_first_char){case 'i':find_table(s, exp_first_char, 0);break;case '+':find_table(s, exp_first_char, 1);break;case '*':find_table(s, exp_first_char, 2);break;case '(':find_table(s, exp_first_char, 3);break;case ')':find_table(s, exp_first_char, 4);break;case '#':find_table(s, exp_first_char, 5);break;}}}int main(){//cout << "输入要判断的分析串:";string temp;cin >> temp;for (int i = 0;i < ();i++)inputstring[i] = temp[i];inputstring[()] = '#';instr_index = () + 1;Initlize();cout << "步骤\t\t 状态栈\t符号栈\t 输入串\t 动作\n";start_find();return 0;}四、实验评价、收获与体会这一周真是惊险万分,有周二四个小时OS实验,周三网络考试,周三就要验收实验,还有一堆事好像老师都喜欢集体行动把事情堆到一起解决。
合肥工业大学编译原理实验报告(完整代码版)

计算机与信息学院编译原理实验报告专业班级信息安全13-1班学生姓名及学号马骏 2013211869 课程教学班号任课教师李宏芒实验指导教师李宏芒实验地点实验楼机房2015 ~2016 学年第二学期实验1 词法分析设计一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用二、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。
2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。
3、根据测试数据进行测试。
测试实例应包括以下三个部分:全部合法的输入。
各种组合的非法输入。
由记号组成的句子。
4、词法分析程序设计要求输出形式:例:输入VC++语言的实例程序:If i=0 then n++;a﹤= 3b %);输出形式为:单词二元序列类型位置(行,列)(单词种别,单词属性)for (1,for ) 关键字(1,1)i ( 6,i ) 标识符(1,2)= ( 4,= ) 关系运算符(1,3)120 ( 5,0 ) 常数(1,4)then ( 1,then) 关键字(1,5)n (6,n ) 标识符(1,6)++ Error Error (1,7);( 2, ; ) 分界符(1,8)a (6,a ) 标识符(2,1)﹤= (4,<= ) 关系运算符(2,2)3b Error Error (2,4)% Error Error (2,4)) ( 2, ) ) 分界符(2,5);( 2, ; ) 分界符(2,6)三、实验内容用VC++/VB/JA V A 语言实现对 C 语言子集的源程序进行词法分析。
通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。
编译原理实验指导书(-).docx

编译原理实验指导书合肥学院计算编译原理实验指导书实验一词法分析一、实验目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程屮将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识別出各个具有独立意义的单词, 即基木保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二、实验预习提示1、词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。
词法分析器的单词符号常常农示成以下的二元式(单词种别码,单词符号的属性值)。
本实验中,采用的是一类符号一种别码的方式。
2、单词的BNF表示<标识符> -V字母〉v字母数字串〉V字母数字串一V字母〉V字母数字串>|v数字〉V字母数字串〉Iv下划线>v字母数字串I e<无符号整数一V数字〉v数字串〉V数字串〉一V数字〉V数字串〉v加法运算符>-+<减法运算符〉->・V大于关系运算符>->>V大于等于关系运算符>-> =3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。
如当前待分析字符串为“”,当前字符为此时,分析器倒底是将其分析为犬于关系运算符还是犬于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。
超前读了一个字符所以要回退一个字符,词法分析器才能正常运行。
在分析标识符,无符号整数等时也有类似情况。
4、模块结构Y饗冲区扫播一个辛閒N ▼三、实验过程和指导:(-)准备:1・阅读课木有关章节,明确语言的语法,写出基木保留字、标识符、常'数、运算符、分隔符和程序例。
2 .初步编制好程序。
3•准备好多组测试数据。
(二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。
第二次上机调试通过。
(三)程序要求:程序输入/输出示例:如源程序为C语言。
输入如卜•一段:main(){int a,b;a = 1 0;b = a 4- 20;}要求输出如下图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宣城校区
实验报告
课程名称编译原理
专业班级计算机0001班
学生姓名及学号赵保飞 68
指导教师李芒宏
实验地点计算机中心楼第四机房
2017 ~ 2018 学年第一学期
《编译原理》课程实验报告实验名称词法分析设计
姓名赵保飞系院专业计算机科学
与技术
班级
计算机01
班
学号68
实验日期指导教师李芒宏成绩
一、实验目的和要求
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设
计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的
理解,并能正确地、熟练地运用。
二、实验原理
(1)实验数据结构说明
K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符(2)实验算法描述
(3)算法流程图
三、源程序代码和测试结果
package lexicalAnalysis;
import.*;
import.*;
public class lexicalAnalysis{
static String
k[]={"for","main","if","while","void","public","static","printf","scanf","asm","do","return","typedef ","auto","double","break","short","using","default","long"};ength()==1){quals(b))){
display(4,r[i],' ');ength()==2){quals(a))){
display(4,r[i],' ');
;
import.*;
import WinGrid extends JFrame{
GridLayout grid;
JPanel chessboard;
JTextField text;
JTextArea textShow;
JButton button;
ReaderListen listener;
WinGrid(){
init();
setVisible(true);
setDefaultCloseOperation;
}
void init(){
setLayout(new FlowLayout());
text=new JTextField(10);
setBounds(466,166,500,400);
button=new JButton("读取");
textShow=new JTextArea(9,30);
listener=new ReaderListen();
tempp[k][1]=temp0_string; tempp[k][2]=(i);
tempp[k][3]=rule;
tempp[k][4]=();
v=();
action="pop";
if(vnNum(v)!=-1){
left = 'E';
strcpy(s_have[1].sright, "E+T");left = 'E';
strcpy(s_have[2].sright, "T");left = 'T';
strcpy(s_have[3].sright, "T*F");left = 'T';
strcpy(s_have[4].sright, "F");left = 'F';
strcpy(s_have[5].sright, "(E)");left = 'F';
strcpy(s_have[6].sright, "i");ove[0] = 5;
action[0].move[3] = 4;
action[1].move[1] = 6;
action[2].change[1] = 2;
action[2].move[2] = 7;
action[2].change[4] = 2;
action[2].change[5] = 2;
action[3].change[1] = 4;
action[3].change[2] = 4;
action[3].change[4] = 4;
action[3].change[5] = 4;
action[4].move[1] = 5;
action[4].move[3] = 4;
action[5].change[1] = 6;
action[5].change[2] = 6;
action[5].change[4] = 6;
action[5].change[5] = 6;
action[6].move[0] = 5;
action[6].move[3] = 4;
action[7].move[0] = 5;
action[7].move[3] = 4;
action[8].change[1] = 6;
action[8].change[4] = 11;
find_table(s, exp_first_char, 1);
break;
case '*':
find_table(s, exp_first_char, 2);
break;
case '(':
find_table(s, exp_first_char, 3);
break;
case ')':
find_table(s, exp_first_char, 4);
break;
case '#':
find_table(s, exp_first_char, 5);
break;
}
}
}
int main()
{
//cout << "输入要判断的分析串:";
string temp;
cin >> temp;
for (int i = 0;i < ();i++)
inputstring[i] = temp[i];
inputstring[()] = '#';
instr_index = () + 1;
Initlize();
cout << "步骤 \t\t 状态栈 \t符号栈 \t 输入串 \t 动作\n";
start_find();
return 0;
}。