无符号数的词法分析程序
一、实验目的和要求
(1)初步掌握编译原理的实验的技能; (2)验证所学理论、巩固所学知识并加深理解。
二、实验内容和原理
内容:掌握词法分析的基本思想,并用高级语言编写无符号数(包括整数和实数)的词法分析程序。
要求:从键盘中输入一字符串(包括字母、数字等),编写程序识别出其中的无符号数。 无符号数的文法规则课定义如下:
<无符号数> <无符号实数>|<无符号整数>
<无符号实数> <无符号整数>.<数字串>[E<比例因子>] <比例因子> <有符号整数>
<有符号整数> [+|-]<无符号整数> <无符号整数> <数字串> <数字串> <数字>{<数字>} <数字> 0 1 2 3 4 5 6 7 8 9
本实验中我利用了状态转化图的思想,下面是试验中用到构造的状态转化图:
数S0+/-S1数字.S2E/eS5S3数字E/e+/-S4字数字数S6数字S7数字字
数字描述状态机的代码格式如下: 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( \识别结束,您所输入的字符串中不包含任何实数!\
else { realnumberAmount ++ ; if( realnumberAmount == 1 ) System.out.println( \识别结束,您所输入的字符串中所包含的实数如下:\
if( resultNumber.length( ) != 0 ) { if( eFlag == 1 ) if( basePlusMinus == 1 ) System.out.println( \正指数实数:\Double.parseDouble( resultNumber ) ) ;
else System.out.println( \负指数实数:\Double.parseDouble( resultNumber ) ) ;
else