词法、语法、语义分析结合(3)

2019-04-01 22:47

case ')': { InputWordType=RB; out(RB,\ } break; case '#': { InputWordType=OVER; out(OVER,\ } break; default: { InputWordType=UNKNOWN; report_error(row); }break; }

return; }

///////////////////////////////////无符号数判断矩阵执行程序

int EXCUTE (int state, int symbol,FILE *fp,char JudgeStr[],int row,int index)

{//row用于指示出错的行数,index用于为待输出的字符串赋结束符‘\\0’时用 switch (state) {

case 0:switch (symbol) {

case DIGIT: n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON;break; case POINT: w=0;n=0;p=0;e=1;CurrentState=3;Class=UCON;break; default: { Class=ClassOther;

CurrentState=EndState; InputWordType=UNKNOWN; printf(\无符号数的第一个字符是非法的!\\n\ } }

break;

case 1:switch (symbol) {

case DIGIT: w=w*10+d;break; //CurrentState=1 case POINT: CurrentState=2;break;

case POWER: CurrentState=4;break; default: { if (ch!=EOF)//如果是因为读到文件结束字符而终止识别(是正确识别一个无符号数结束),就不应该回退,否则可能造成死循环 { fseek(fp,-1,1);//遇到其他的字符,可能是一条语句中的其他字符,需后退,因为主函数外层循环每次都要读一个字符进行判断,而这个判读不回溯,所以在内部把这个多读的字符回溯 } ICON=w;CurrentState=EndState; JudgeStr[index-1]='\\0'; InputWordType=UCON; printf(\对应 %s\\n\ }break; }

break;

case 2:switch (symbol) {

case DIGIT: n++;w=w*10+d;break; case POWER: CurrentState=4;break; default: { if (ch!=EOF) { fseek(fp,-1,1); } FCON=w*pow(10,e*p-n);CurrentState=EndState; JudgeStr[index-1]='\\0'; InputWordType=UCON; printf(\对应于 %s\\n\ } }

break;

case 3:switch (symbol) {

case DIGIT: n++;w=w*10+d;CurrentState=2;break; default: { /* if (ch!=EOF)//识别无符号数产生错误时,不应该再回溯,应该把造成错误的那个字符算到错误的无符号数字符串中,再向下面识别单词时跳过这个字符,不回溯就能达到这个目的

{ fseek(fp,-1,1); }*/ InputWordType=UNKNOWN; HandleError(JudgeStr,row);CurrentState=EndState; } }

break;

case 4:switch (symbol) {

case DIGIT: p=p*10+d;CurrentState=6;break; case MINUS: e=-1;CurrentState=5;break; case PLUS: CurrentState=5;break; default: { /* if (ch!=EOF) { fseek(fp,-1,1); }*/ InputWordType=UNKNOWN; HandleError(JudgeStr,row);CurrentState=EndState; } }

break;

case 5:switch (symbol) {

case DIGIT: p=p*10+d;CurrentState=6;break; default: { /* if (ch!=EOF) { fseek(fp,-1,1); }*/ InputWordType=UNKNOWN; HandleError(JudgeStr,row);CurrentState=EndState; }//判断一个无符号数的最后一个字符应该都是多余读取的,所以为了防止引起后面再次判断下一无符号数时产生呑字符的现象,都应该回溯一个字符

}

break;

case 6:switch (symbol) {

case DIGIT:p=p*10+d;break; default:

{ if (ch!=EOF) { fseek(fp,-1,1); } FCON=w*pow(10,e*p-n);CurrentState=EndState; JudgeStr[index-1]='\\0'; InputWordType=UCON; printf(\对应 %s\\n\ }break; }

break; }

return CurrentState; }

////////////////////////////////无符号数判断过程中的字符类型判断程序 int GetChar (char ch) {

if(isdigit(ch)) {d=ch-'0';return DIGIT;} if (ch=='.') return POINT;

if (ch=='E'||ch=='e') return POWER; if (ch=='+') return PLUS; if (ch=='-') return MINUS; return OTHER; }

/////////////////////////////判断出错报错程序 int HandleError (char StrJudge[],int row) {

printf (\不合法的无符号数!\\n\ return 0; }

/////////////////////////////////////语法分析程序 int SLRControl(FILE* fp) {

while(Action[TopState][InputWordType][0] != 'A') { if (UNKNOWN==InputWordType) { printf(\分析语句 %i 时词法分析出错******************\\n\ return 0; }

printf(\栈顶状态:%i\\n\

printf(\扫描的单词类型:%i\\n\ /*if ('A'==Action[State][WordType][0]) { TopState=0;//正确后把栈顶状态置为初始化 StackPoint=0;//同理上面 memset(StateStack,-1,sizeof(StateStack)); printf(\ return 1; }*/

if (-1==TopState) { printf(\分析语句 %i 时状态栈栈顶指针错误!分析结束\\n\ return 0; }

if (' ' == Action[TopState][InputWordType][0]) { printf(\分析语句 %i 时语法分析出错!分析结束\\n\ return 0; }

else if('s'==Action[TopState][InputWordType][0]) { //TopState=atoi(&Action[TopState][InputWordType][1]); Push(atoi(&Action[TopState][InputWordType][1])); printf(\执行压栈操作\\n\ if (EOF!=fgetc(fp)) { scanner(fp); } else { printf(\语句 %i 不完整!分析结束\\n\ return 0; } }

else if('r'==Action[TopState][InputWordType][0]) { //do//用一个while循环为了可能遇到连续规约的情况,即从文件中扫描一个单词之后,可能连续规约多次 //{


词法、语法、语义分析结合(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:区分间接故意与过于自信的过失的客观标准

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: