1、2、 语法分析程序设计与实现选择对各种常见高级程序设计语言都较为通用的语法结构算术表达式的一个简化子集作为分析对象,根据如下描述其语法结构的BNF定义G2,任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。G2: | +-*/ | ()若将语法范畴、和分别用E、T、F和i代表,则G2可写成:G2E:E T | E+T | E-T T F | T*F | T/F F i | (E)由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID 若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入
2、串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。对文法G211NE12GT13GE:14IS+15PL-16MI*17MU/18DI2) 词法分析器的设计函数GETCHAR:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。字符数组TOKEN:用来依次存放一个单词词文中的各个字符。函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c
3、置为零。函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。图1 识别表I所列语言中的部分单词的DFA及相关的语义过程3)词法分析程序的实现编写的扫描器:char TOKEN20,TOKEND20,TOKENDO20;int lookup (char*);void out (int, char*);void report_error (void);/extern void LEX(void);int siagn=0;/标志位FILE *fp1; char *KeyWordTableM
4、AX_KEY_NUMBER=begin,end, ifthenelse, KEY_WORD_END;/* 查保留字表,判断是否为关键字 */int lookup (char *token)int n=0;while (strcmp(KeyWordTablen, KEY_WORD_END) /*strcmp比较两串是否相同,若相同返回0*/if (!strcmp(KeyWordTablen, token) /*比较token所指向的关键字和保留字表中哪个关键字相符*/return n+1; /*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/break;n+;return 0;
5、void scanner_example (FILE *fp)char ch; int i, c, isd,cpoint; double o;ch=fgetc (fp);/fgetc函数 在文件中读取一个字符if (isalpha (ch) /*it must be a identifer! 它必须是一个标识符 判断字符ch是否为英文字母,若为小写字母,返回2,若为大写字母,返回1。若不是字母,返回0*/TOKEN0=ch; ch=fgetc(fp); i=1;while (isalnum (ch)|ch=.)/isalnum函数 判断ch是否为空 当ch为数字0-9或字母a-z及A-Z时,返
6、回非零值,否则返回零if(ch=)cpoint=-1;/标志字符串中有小数点TOKENi=ch;i+;ch=fgetc (fp);TOKENi= 0;if(ch=|ch=) fseek (fp,-2,1);siagn=1;else fseek (fp,-1,1);/fseek(fp,-1,1); /* retract fseek函数 每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)*/i=0;if(TOKENi=o|TOKENi=Oi+;if(TOKENi=xXi+;while(TOKENi!if(!isdigit(TOKENi)|TOKENi!a|TOKENi!bcdef|TOKENi!ABCDEFisd=-1;isd=16;/标志字符串十六进制i+;else if(TOKENi=01234567)isd=8;/标志字符串八进制if(TOKENi!isd=8;if(isd=8)strncpy(TOKEND,TOKEN+1,strlen(TOKEN)-1);/拷贝函数/printf(%o,atof(TOKEND);o=octal(TOKEND);%g,o);sprintf(TOKENDO, ,octal(TOKEND);out(OCTAL,TOKENDO);else if(isd=16)strn
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1