CMM解释器尹晓宁2013302580003语义分析孙宸2013302580013中间代码生成,解释执行杨伟2013302580017语法树的生成词法分析语法分析语义分析中间代码生成,解释执行测试用例1可以识别的token保留字if,else,while,int,real,read,write运算符+、-、*、/、、、=、==、分隔符(),[],{},;,//,/*,*/标识符由数字、字母和下划线组成的串,但必须以字母开头、且不能以下划线结尾的串常量整数和小数分析过程2词法分析语法分析语义分析中间代码生成,解释执行测试用例文法结构1程序=(分程序)*分程序=声明赋值语句|if语句|while语句|read语句|write语句声明赋值语句=赋值分语句|类型声明分语句声明分语句=(数组变量|变量)(“;”|赋值分语句)赋值分语句=数组赋值|变量赋值数组赋值=数组变量“=”结果语句“;”变量赋值=变量“=”结果语句“;”结果语句=运算表达式|read语句运算表达式=分表达式(算数运算符分表达式)*分表达式=因子|“(”运算表达式“)”if语句=if“(”布尔表达式“)”“{”分程序“}”else“{”分程序“}”while语句=while“(”布尔表达式“)”“{”分程序“}”read语句=read“(”运算表达式“)”write语句=write“(”运算表达式“)”布尔表达式=运算表达式关系运算符运算表达式关系运算符=“”|“==”|“”因子=int型常量|real型常量|变量|数组变量类型=int|real算数运算符=+|-|*|/词法分析语法分析语义分析测试用例中间代码生成,解释执行1检查类型每个变量在使用前是否有声明。赋值语句左右两边类型是否正确。变量在同一层中是否被声明多次。read后面的变量是否声明过。数组下标是否是正整数。符号表结构2Symboltypeboolean,若变量是int型,为true;否则为falsenameString,存放变量名isNullboolean,判断变量是否赋值arrayLengthint,若该变量为数组,则存放数组长度,否则为-1heightint,记录变量的层次SymbolTabletableListSymbol,存储已经声明的Symbol。词法分析语法分析语义分析中间代码生成,解释执行测试用例1解释执行的符号表Notation/ArrayNotationnameString,存放变量名levelint,记录变量层次typeboolean,true变量为int型,false为real型valueString/String[],存放变量值LegendvarsListNotation,存放一般变量arraysListArrayNotation,存放数组变量clearLevel()清楚level层的所有变量setValue()给level层名为name的变量赋值getValue()获取level层名为name的变量2操作项操作数1操作数2操作结果a1+a2ADDa1a2@1a1-a2MINUSa1a2@1a1*a2MULa1a2@1a1/a2DIVa1a2@1a1a2LESSa1a2BoolVar1a1==a2EQUALa1a2BoolVar1a1a2UNEQUALa1a2BoolVar1a1=a2ASSIGNa2a1null1CONST_INT1nullatTable1.2CONST_REAL1.2nullatTableinta1;NEWa1nullatTableread(a1)READa1nullnullwrite(a1)WRITEa1nullnull四元式的结构操作项操作数1操作数2操作结果if(){}else{}JUMP_AT_BEGINIFbeginELSEendBoolVar1LABLEIFbeginnullnullJUMP_AT_ENDELSEbeginELSEendBoolVar1LABLEELSEbeginnullnullLABLEELSEendnullnullwhile(){}JUMP_AT_BEGINWHILEbeginWHILEendBoolVar1LABLEWHILEbeginnullnullJUMP_AT_ENDWHILEbeginWHILEendBoolVar1LABLEWHILEendnullnull词法分析语法分析语义分析测试用例中间代码生成,解释执行THANKS