要求:
定义模拟的简单语言的词法构成,设计词法分析器,要求将用模拟语言书写的源程序进行词法分析,输出单词序列文件和错误信息文件,若有错误,必须输出错误在源程序中行号和列号。
主要参考了文章:词法分析器(分析C语言),对原文代码进行了一定的更改。
原文章理解:
原文通过以下代码从文本中读取代码字符。实验中发现其实不加w!=' '的判定条件也不会读取空格、换行和制表符。读入的字符全都是连在一起的,例如:inta,b;a=1;b=2;对单词的分割不太友好。
原文使用当读入一个字符时判断已有字符串是否与关键字匹配来进行类似inta;这种的分割。但是无法分割do和double这样的关键字,double会在读取2个字符时直接判断成do 。
freopen("s.txt","r",stdin);
freopen("result.txt","w",stdout);
length=0;
while(cin>>w){
if(w!=' '){
letter[length]=w;
length++;
} //去掉程序中的空格
}
本文做了一些更改:
1、使用getline()获取代码,读取到的代码保留了空格和制表符,没有换行符,使用空格进行单词划分,更符合直观印象。
2、由于按行提取,可以找到单词所在的行号和列号,可以进行出错提示。
3、增添了字符型常量和字符串常量的划分。
4、将输出结果保存到文本文档中。
其他不足之处:
1、可能有些情况识别时没有考虑到,比如一开始认为标识符中只有字母或数字,后来想到还可能有下划线。其他没有意识到的情况也肯定有。
2、字符识别时不考虑多字符的情况,比如'\ddd'。只考虑了单字符和单字符转义字符。转义字符应该有转义字符表进行匹配比较合适,本文直接只判断了'\'后跟任意字符,可能此字符并没有实际意义。
3、判断'>='这样两个字符的符号时,是判断第一个字符如果是'>''<''!'这样有可能是多字符运算符时再判断下一个是不是'=',才能识别成一个运算符。个人感觉这应该不算一个好方法。
流程:
步骤:
1、对不同的符号划分种别码,其中预留部分数字可作以后添加;