无符号数的词法分析程序一、实验目的和要求(1)初步掌握编译原理的实验的技能;(2)验证所学理论、巩固所学知识并加深理解。
二、实验内容和原理内容:掌握词法分析的基本思想,并用高级语言编写无符号数(包括整数和实数)的词法分析程序。
要求:从键盘中输入一字符串(包括字母、数字等),编写程序识别出其中的无符号数。
无符号数的文法规则课定义如下:<无符号数> <无符号实数>|<无符号整数><无符号实数> <无符号整数>.<数字串>[E<比例因子>]<比例因子> <有符号整数><有符号整数> [+|-]<无符号整数><无符号整数> <数字串><数字串> <数字>{<数字>}<数字> 0 1 2 3 4 5 6 7 8 9本实验中我利用了状态转化图的思想,下面是试验中用到构造的状态转化图:字描述状态机的代码格式如下:int state = S0 ;while(1){Switch(state){case S0 :if(T0转移条件满足) {状态转移到满足T0的次态;操作;}if(T1转移条件满足) {状态转移到满足T1的次态;操作;}if(T2转移条件满足) {状态转移到满足T2的次态;操作;}…Break ;case S1 ://插入S1状态下的操作;break ;…}}实验代码://本程序主要实现实数的识别import java.io.BufferedReader ;import java.io.IOException ;import java.io.InputStreamReader ;public class RealNumberIdentified {/*---------------------------------成员变量的定义---------------------------------------*/private final int S_0 = 0 ;private final int S_1 = 1 ;private final int S_2 = 2 ;private final int S_3 = 3 ;private final int S_4 = 4 ;private final int S_5 = 5 ;private final int S_6 = 6 ;private final int S_7 = 7 ;private char originNumber[ ] ; //用来记录原始的数字串private String resultNumber = new String( ) ;private int realnumberAmount = 0 ; //用来记录识别出的实数的个数private int realnumberFlag = 0 ; //用于标识该实数是正数还是负数private int eFlag = 0 ; //用来标识该实数是不是指数实数private int pointFlag = 0 ; //用来标识该实数是否是小数private int basePlusMinus = 1 ; //用来标识底数的符号private int count = 0 ; //用来记录已经识别数字串的位数private int currentState = S_0 ; //用来记录当前所处于的状态/*---------------------------------------------------------------------------------------*//*-------------------------该方法用来初始化一些参数------------------------------------*/private void init( ){resultNumber = new String( ) ;basePlusMinus = 1 ;eFlag = 0 ;pointFlag = 0 ;}/*----------------------------------------------------------------------------------------* //*---------------------init( )方法用于去除实数串开始和结尾的无效的空格----------------*/private void initOriginNumber( String str ){str = str.trim( ) ;str += '#' ;originNumber = str.toCharArray( ) ;}/*-----------------------------------------------------------------------------------------*//*---------------------------printResult()方法用来输出识别的结果------------------------*/private void printResult( ){if( realnumberFlag == 0 )System.out.println( "\n识别结束,您所输入的字符串中不包含任何实数!" ) ;else{realnumberAmount ++ ;if( realnumberAmount == 1 )System.out.println( "\n识别结束,您所输入的字符串中所包含的实数如下:" ) ;if( resultNumber.length( ) != 0 ){if( eFlag == 1 )if( basePlusMinus == 1 )System.out.println( "正指数实数:" + Double.parseDouble( resultNumber ) ) ;elseSystem.out.println( "负指数实数:" + Double.parseDouble( resultNumber ) ) ;elseif( pointFlag == 1 )System.out.println( " 小数:" + Double.parseDouble( resultNumber ) ) ;else{if( basePlusMinus == 1 )System.out.println( " 正整数:" + Long.parseLong( resultNumber ) ) ;elseSystem.out.println( " 负整数:" + Long.parseLong( resultNumber ) ) ;}}}}/*-----------------------------------------------------------------------------------------*//*--------------------------------识别该实数串的过程-------------------------------------*/private void identifiedProcess( String str ){initOriginNumber( str ) ;while( count < originNumber.length ){switch( currentState ){case S_0 : {if( originNumber[ count ] == '+' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_1 ;}else{if( originNumber[ count ] == '-' ){resultNumber = resultNumber + originNumber[ count ] ;basePlusMinus = 0 ;currentState = S_1 ;}elseif( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;realnumberFlag = 1 ;currentState = S_2 ;}else{currentState = S_0 ;}}count ++ ;break ;}case S_1 : {if( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;realnumberFlag = 1 ;currentState = S_2 ;}else{resultNumber = resultNumber.substring( 0 , resultNumber.length( ) - 1 ) ;currentState = S_0 ;}count ++ ;break ;}case S_2 : {if( originNumber[ count ] == '.' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_3 ;}elseif( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_2 ;}elseif( originNumber[ count ] == 'E' || originNumber[ count ] == 'e' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_5 ;}else{if( originNumber[ count ] == '+' || originNumber[ count ] == '-' )count -- ;printResult( ) ;init( ) ;currentState = S_0 ;}count ++ ;break ;}case S_3 :{if( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;pointFlag = 1 ;currentState = S_4 ;}else{resultNumber.length( ) - 1 ) ;printResult( ) ;init( ) ;currentState = S_0 ;}count ++ ;break ;}case S_4 : {if( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_4 ;}else{if( originNumber[ count ] == 'E' || originNumber[ count ] == 'e' ){originNumber[ count ] ;currentState = S_5 ;}else{if( originNumber[ count ] == '+' || originNumber[ count ] == '-' )count -- ;printResult( ) ;init( ) ;currentState = S_0 ;}}count ++ ;break ;}case S_5 : {if( originNumber[ count ] == '+' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_6 ;}elseif( originNumber[ count ] == '-' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_6 ;}elseif( originNumber[ count ] >= 49 && originNumber[ count ] <= 57 ){resultNumber = resultNumber + originNumber[ count ] ;eFlag = 1 ;currentState = S_7 ;}else{resultNumber = resultNumber.substring( 0 , resultNumber.length( ) - 1 ) ;printResult( ) ;init( ) ;currentState = S_0 ;count -- ;}count ++ ;break ;}case S_6 : {if( originNumber[ count ] >= 49 && originNumber[ count ] <= 57 ){resultNumber = resultNumber + originNumber[ count ] ;eFlag = 1 ;currentState = S_7 ;}else{resultNumber = resultNumber.substring( 0 , resultNumber.length( ) - 2 ) ;printResult( ) ;init( ) ;currentState = S_0 ;count -= 2 ;}count ++ ;break ;}case S_7 : {if( originNumber[ count ] >= 48 && originNumber[ count ] <= 57 ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_7 ;}else{if( originNumber[ count ] == '+' ||originNumber[ count ] == '-' )count -- ;printResult( ) ;init( ) ;currentState = S_0 ;}count ++ ;break ;}}}printResult( ) ;}/*------------------------------------------------------------------------------------------*//*----------------------------------------主方法-------------------------------------------*/public static void main(String[ ] args) throws IOException {System.out.print( "请输入欲识别的实数:" ) ;BufferedReader buf = new BufferedReader( new InputStreamReader( System.in ) ) ;new RealNumberIdentified( ).identifiedProcess( buf.readLine( ) ) ;}/*------------------------------------------------------------------------------------------*/}三、实验结果四、讨论、分析和心得在本次试验我并没有采用课本中提供的算法,而是将在课本中学到的状态转化图和自动机的理论加以利用以基本实现本次实验的要求。