词法分析 一、实验目的 使用 直接分析法编制C 语言子集的词法分析程序 二、实验要求 利用C 语言编制递归下降分析程序,并对简单语言进行语法分析。 2.1 待分析的简单语言的语法 用扩充的BNF 表示如下: ⑴<程序>::=begin<语句串>end ⑵<语句串>::=<语句>{;<语句>} ⑶<语句>::=<赋值语句> ⑷<赋值语句>::=ID:=<表达式> ⑸<表达式>::=<项>{+<项> | -<项>} ⑹<项>::=<因子>{*<因子> | /<因子> ⑺<因子>::=ID | NUM | (<表达式>) 2.2 实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。 例如: 输入 begin a:=9; x:=2*3; b:=a+x end # 输出 success! 输入 x:=a+b*c end # 输出 error 2.3 词法分析程序的酸法思想 (1)主程序示意图如图 2-1 所示。 图 2-1 词法分析主程序示意图 (2)递归下降分析程序示意图如图 2-2 所示。 置初值 调用scaner 读下一个单词符号 调用lrparser 结束 (3)语句串分析过程示意图如图2-3 所示。 否 是 否 是 否 是 否 图2-3 语句串分析示意图 是 图2-2 递归下降分析程序示意图 (4)statement 语句分析程序流程如图2-4、2-5、2-6、2-7 所示。 否 否 否 是 图2-4 statement 语句分析函数示意图 图2-5 ex pression 表达式分析函数示意图 是否begin? 调用 scaner 调用语句串分析程序 是否end? 调用 scaner sy n=0&&kk=0? 打印分析成功 出错处理 调用 statement 函数 是否 ;? 调用 scaner 调用 statement 函数 出错处理 是否标识符? 调用 scaner 是否:=? 调用 scaner 调用 ex pression 函数 出错处理 调用 term 函数 是否+ , -? 调用 scaner 调用 term 函数 出错处理 是 否 否 是 是 否 否 是 图 2-6 term 分析函数示意图 否 是 图2-7 factor 分析过程示意图 三、词法分析程序的 C 语言程序源代码: #include "stdio.h" #include "string.h" char prog[100],token[8],ch; char *rwtab[6]={"begin","if","then","while","do","end"}; int syn,p,m,n,sum; int kk; factor(); expression(); yucu(); term(); statement(); lrparser(); scaner(); main() { p=kk=0; printf("\nplease input a string (end with '#'): \n"); do 调用 factor...