编译原理词法分析器
编译原理是个很难的学科,老师这么说的,第一个实验就是写一个简单的词法分析器。分析器的作用就是能够从文本中分离出相应的保留字、标识符、界符、数字等等。本例具体要求如下:
1、根据以下的正规式,编制正规文法,画出状态图;
标识符 <字母>(<字母>|<数字字符>)*
十进制整数 0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)
八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
十六进制整数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*
运算符和界符 + - * / > < = ( ) ;
关键字 if then else while do
2、根据状态图,设计词法分析函数int scan( ),完成以下功能:
1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,
2)以二元式形式输出单词<单词种类,单词属性>
其中单词种类用整数表示:
0:标识符
1:十进制整数
2:八进制整数
3:十六进制整数
运算符和界符,关键字采用一字一符,不编码
其中单词属性表示如下:
标识符,整数由于采用一类一符,属性用单词表示
运算符和界符,关键字采用一字一符,属性为空
输入数据:
编辑一个文本文件program.txt,在文件中输入如下内容:
if data+92>0x3f then
data=data+01;
else
data=data-01;
正确结果:
<if , ->
<0 , data>
<+ , ->
<1 , 92>
<> , ->
<3 , 3f>
<then , ->
<0 , data>
<= , >
<0 , data>
<+ , ->
<2 , 1>
<; ,->
<else , ->
<0 , data>
<= , ->
<0 , data>
<- , ->
<2 , ->
<; , ->
OK,接下来贴出代码C++版
///////////////////////////////
/////Author:Jameslong
/////Date:4/12/2017
///