Федеральное агентство железнодорожного транспорта
_____________________
Московский государственный университет путей сообщения
(МИИТ)
____________________
Институт управления и информационных технологий
___________________
Кафедра "Вычислительные системы и сети"
О Т Ч Е Т
по дисциплине
"Системное программное обеспечение"
Лабораторная работа №6
“Лексические анализаторы”
Выполнил: Протасов В. А.
Проверил: Михайлюк А. В.
МОСКВА 2012
Вариант № 1, 6
Содержание работы
На основании программы, приведенной лекции 11 построить лексический анализатор, выполняющий распознавание положительных и отрицательных чисел, содержащих целую и дробную части, разделенную запятой, причем и целая и дробная части могут отсутствовать, но не обе одновременно.
Методические указания
Использовать интегрированную среду разработки JBuilder.
За основу программы взять проект Numbres из лекции 11.
Примеры:
25
+76
-12
22,35
+,57
-,0001
Содержание отчета
Текст задания.
Структуру конечного автомата в виде графа переходов и выходов
Распечатка исходного текста программы
- структура конечного автомата в виде графа переходов и выходов
- исходный текст программы
Класс Automat
package myLaba;
import java.util.*;
public class Automat {
private Tape tape;
private State start;
private State currentState;
private Hashtable states;
private int znak=1;
private double number;
private double decDigit;
private int n;
private int flag=0;
public Automat(Tape tape) {
states = new Hashtable();
this.tape = tape;
State start = new State("start");
addState(start);
setStart(start);
State s1 = new State ("s1");
addState(s1);
State s2 = new State("s2");
addState(s2);
State s3 = new State("s3");
addState(s3);
State s4=new State("s4");
addState(s4);
State success = new State ("success", true);
addState(success);
start.addAction(new ActionPlus(s1));
start.addAction(new ActionMinus(s1));
start.addAction(new ActionBeginPositiveNumber(s2));
start.addAction(new ActionCharNumber(s3));
s1.addAction(new ActionBeginNumber(s2));
s1.addAction(new ActionCharNumber(s3));
s2.addAction (new ActionContNumber(s2));
s2.addAction (new ActionCharNumber(s3));
s3.addAction (new ActionEOL(success));
s3.addAction (new ActionDdigit(s4));
s4.addAction (new ActionDdigit(s4));
s4.addAction (new ActionEOL(success));
s2.addAction (new ActionEOL(success));
}
private void addState (State newState){
String key = newState.getName();
states.put(key, newState);
}
public void setStart (State state){
start = state;
}
public void process() throws LexError {
currentState = start;
int c = tape.getNext();
while (true){
State nextState = currentState.process(c);
if (nextState == null){
throw new LexError("Для состояния " + currentState.getName()
+ " и входного символа " + (char)c
+ " не определенот следующее состояние");
}
currentState = nextState;
if (c == -1)break;
c = tape.getNext();
}
if (!currentState.isSuccess()){
throw new LexError("По исчерпанию входной ленты "
+ "автомат не в финальном состоянии");
}
}
public double getNumber()
{
return number;
}
public boolean isSuccess(){
return currentState.isSuccess();
}
private abstract class ProtoAction implements Action{
private State nextState;
public ProtoAction(State nextState){
this.nextState = nextState;
}
public State getNextState(){
return nextState;
}
}
private class ActionPlus extends ProtoAction{
private State nextState;
public ActionPlus (State nextState){
super(nextState);
}
public boolean process (int c){
if ( (char)c == '+'){
znak = 1;
return true;
}
return false;
}
}
private class ActionMinus extends ProtoAction{
public ActionMinus(State nextState){
super(nextState);
}
public boolean process(int c){
if ((char)c == '-'){
znak = -1;
return true;
}
return false;
}
}
private class ActionBeginPositiveNumber extends ProtoAction{
public ActionBeginPositiveNumber(State nextState){
super (nextState);
}
public boolean process(int c){
if ((char)c >= '0' && (char)c <= '9')
{
znak = 1;
number = c - '0';
return true;
}
return false;
}
}
private class ActionBeginNumber extends ProtoAction{
public ActionBeginNumber(State nextState){
super (nextState);
}
public boolean process(int c){
if ((char)c >= '0' && (char)c <= '9'){
number = c - '0';
return true;
}
return false;
}
}
private class ActionCharNumber extends ProtoAction
{
public ActionCharNumber(State nextState)
{
super(nextState);
}
public boolean process(int c)
{
if((char)c=='.'||(char)c==',')
{
return true;
}
return false;
}
}
private class ActionDdigit extends ProtoAction
{
public ActionDdigit(State nextState){
super (nextState);
}
public boolean process(int c)
{
n++;
flag=1;
if ((char)c >= '0' && (char)c <= '9')
{
decDigit=decDigit+(((char)c - '0')/Math.pow(10,n));
return true;
}
return false;
}
}
private class ActionContNumber extends ProtoAction{
public ActionContNumber(State nextState){
super (nextState);
}
public boolean process(int c){
flag=1;
if ((char)c >= '0' && (char)c <= '9'){
number = number *10 + ((char)c - '0');
return true;
}
return false;
}
}
private class ActionEOL extends ProtoAction {
public ActionEOL(State nextState){
super (nextState);
}
public boolean process(int c)
{
if (c == -1)
{
if (flag == 0)
{
try
{
throw new LexError ();
}
catch (LexError ex){
}
}
else
{
if(number==0&&decDigit==0)
{
znak=1;
}
number = znak * (number + decDigit);
return true;
}
}
return false;
}
}
}