词法分析报告(2)

2019-09-01 09:23

int number; //对应每一位上转换后的数字 int dec=0,oct=0,hex=0; //最终的数值,三种进制 word re; //返回值 if(TN==1) //一位数,只能是十进制 { number=convert(ch[0]); if(number==-1||number>9) cout<<\ else { re.kind=INT10; re.value=number; return re; } }

if( (TN==2)&&(ch[0]=='0') ) //两位数,八进制 { number=convert(ch[1]); if( (number>=0)&&(number<=7) ) { re.kind=INT8; re.value=number; return re; } else cout<<\八进制非法\ //报错 }

if( (TN>=2)&&(ch[0]!='0') ) { int *num=new int[TN]; for(i=0;i

//两位位数(含)以上,十进制

if( (number==-1)||(number>9) ) cout<<\十进制非法\报错 }

for(i=0;i0;j--) num[i]*=10; dec+=num[i]; }

re.kind=INT10; re.value=dec; return re;

else if( (TN>=3)&&(ch[0]=='0')&&(ch[1]!='x')&&(ch[1]!='X') ) { }

//三位数(含)以上,八进

int *num=new int[TN-1]; for(i=1;i

if( (number==-1)||(number>7) ) cout<<\八进制非法\ //报错 }

for(i=1;i0;j--) num[i]*=8; oct+=num[i]; }

re.kind=INT8; re.value=oct; return re;

else if( (TN>=3)&&(ch[0]=='0')&&((ch[1]=='x')||(ch[1]=='X')) ) //三位数(含)以上,十六进制 { int *num=new int[TN-2]; for(i=2;i0;j--) num[i]*=16; hex+=num[i]; } re.kind=INT16; re.value=hex; return re; } }

word scan(char ch) { word re; //返回值

while(ch==' '||ch=='\\n') //空格或回车 { fpoint++; if(ch=='\\n') fpoint++; // \\n包括回车和换行所以再加1 file.get(ch); }

num_token=0; //每次要分析一个单词的时候,都要重新对单词中的字符计数 token[num_token]=ch; //单词开始的一个字符都放到存放单词的数组中 token[num_token+1]='\\0'; num_token++;

if(isalpha(ch)) //第一个字符是字母的单词是标识符 { file.get(ch); fpoint++;

while(isalnum(ch)&&!file.eof()) //读取标识符的所有字母和数字 { token[num_token]=ch;token[num_token+1]='\\0'; num_token++; file.get(ch); fpoint++; } fpoint--; file.seekg(fpoint,ios::beg); //后退 re=handle_identifier(token); //处理标识符 return re; //返回单词信息(种别和属性值) } else if(isdigit(ch)) //第一个字符是数字的单词是整数 { file.get(ch); fpoint++; while(isalnum(ch)&&!file.eof()) //十六进制中包含字母x和X,所以整数单词中不一定只包含数字 { token[num_token]=ch; token[num_token+1]='\\0'; num_token++; file.get(ch); fpoint++; } fpoint--; file.seekg(fpoint,ios::beg); //后退 re=handle_number(token,num_token); return re;

} else switch(ch) {

case ':':

file.get(ch); fpoint++; if(ch =='=') { }

//赋值符号

否则出错

//以“:”开头的单词只能是赋值符号,

re.kind=ASG;

re.value=0; return re;

else cout<<\赋值出错\ //报错 break;

///////////////////////////各种运算符/////////////////////////////// case'+': file.get(ch); fpoint++; if(ch=='+') { re.kind=INC; re.value=0; return re; } else { fpoint--; file.seekg(fpoint,ios::beg); //后退 re.kind=ADD; re.value=0; return re; } break; case'-': file.get(ch); fpoint++; if(ch=='-') { re.kind=DECC; re.value=0; return re;; }

else { fpoint--; file.seekg(fpoint,ios::beg); //后退

否则出错

否则出错

re.kind=SUB; re.value=0; return re; } break; case'*': re.kind=MUL; re.value=0; return re ; break; case'/': re.kind=DIV; re.value=0; return re; break; case'!':

file.get(ch); fpoint++; if(ch=='=') { re.kind=NEQ;

re.value=0; return re;

}

else cout<<\ //报错 break; case'=': //等号 file.get(ch); fpoint++;

if(ch=='=')

{

re.kind=EQ; re.value=0; return re; } else cout<<\报错 break; case'>': file.get(ch); fpoint++;

//不等号

//以“!”开头的单词只能是不等号,

//以“=”开头的单词只能是等号,


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

下一篇:10万吨11°淡色啤酒发酵罐的设计

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

马上注册会员

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