大连理工大学软件学院编译技术课程一一词法分析上机实验〃注意:需要建立test文档,文档内为输入实验目的:对循环语句和条件判断语句编写词法分析编译程序, 只能通过一遍扫描完成用C++实现)实验要求:⑴关键字:for if then else while do所有关键字都是小写2)运算符和分隔符:: = + - * / < > <= <> >= ; ( ) #⑶其他标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter | digit)*NUM=digit digit*(4)空格由空白、制表符和换行符组成空格一般用来分隔 ID、NUM、运算符、分隔符和关键字,词法分析阶段通常被忽略各种词法单元对应的词法记号如下:词法单元词法记号词法单元词法记号for1:17if2:=18then3<20else4<>21while5<二22do6>23letter(letter+digit)*10>=24digit digit*11=25+13;26-14(27*15)28/16#0词法分析程序的功能输入:源程序输出:二元组(词法记号,属性值/其在符号表中的位置)构成的序列例如:对源程序x:=5; if (x>0) then x:=2*x+1/3; else x:=2/x; #经词法分析后输出如下序列:(10,x )(18, :二) (11,5)(26,;) (2, if) (27,()……1) 几点说明:( 1)关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表) ,当扫描程序识别出标识符,查关键字表如能查到匹配的单词,则该单词的关键字, 否则为一般标识符 关键表为一个字符串数组, 其描述如下:char *keyword[6]={ ”for”, ”if”, ” then ” ,”else”,” while ”, ”do” };2) ) 程序中需要用到的主要变量为 token , id 和 num.1 ) id 用来存放构成词法单元的字符串;2 ) num 用来存放整数(可以扩展到浮点数和科学计数法表示) ;3 ) token 用来存放词法单元的词法记号可以参考下面的代码:do{lexical(); //将词法单元对应的记号保存到 token 中,属性值保存到 num 或者 id中switch(token) {case 11: printf ("(token, %d\n) ", num); break;case -1: printf("error!\n");break;default: printf("(%d,%s)\n", token, id);}while (token!=0);#include#include#include#include#includeusing namespace std;string keyword[6]={"for","if","then","else","while","do"};bool isLETTER(char temp){if(temp>=a && temp<=z)return true;elsereturn false;}bool isDIGIT(char temp){if(temp>=0 && temp<=9)return true;elsereturn false;}bool isID(string temp){bool flag=true;if(!isLETTER(temp[0]))flag=false;for(int i=1;i=0 && temp[i]<=9))flag=false;}return flag;)void getkey(string temp,int & key)(if(temp=="for") key=1;else if(temp=="if") key=2;else if(temp=="then") key=3;else if(temp=="else") key=4;else if(temp=="while") key=5;else if(temp=="do") key=6;else if(isID(temp)) key=10;else if(isNUM(temp)) key=11;else if(temp=="+") key=13;else if(temp=="-") key=14;else if(temp=="*") key=15;else if(temp=="/") key=16;else if(temp==":") key=17;else if(temp==":=") key=18;else if(temp=="<") key=20;else if(temp=="<>") key=21;else if(temp=="<=") key=22;else if(temp==">") key=23;else if(temp==">=") key=24;else if(temp=="=") key=25;else if(temp==";") key=26;else if(temp=="(") key=27;else if(temp==")") key=28;else if(temp=="#") key=0;else key=-1;}int main(){string temp;char a;int key;queue aqueue;char *array=new char[20];bool flag=true;ifstream file;file.open("test.txt");if(!file)cout<<"cant open test.txt "< || a===){array[i++]=a;a=file.get();}break;case > : a=file.get();if(a===){array[i++]=a;a=file.get();}break;default : a=file.get(); break;}}string t(array,i);aqueue.push(t);}while(!aqueue.empty())temp=aqueue.front();aqueue.pop();getkey(temp,key);switch(key)(case -1: cout<<"error!"<