无符号数的识别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

无符号数的词法分析程序

一、实验目的和要求

(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 ) ) ;

相关文档
最新文档