Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_6_SisPO.docx
Скачиваний:
2
Добавлен:
17.09.2019
Размер:
71.93 Кб
Скачать

Федеральное агентство железнодорожного транспорта

_____________________

Московский государственный университет путей сообщения

(МИИТ)

____________________

Институт управления и информационных технологий

___________________

Кафедра "Вычислительные системы и сети"

О Т Ч Е Т

по дисциплине

"Системное программное обеспечение"

Лабораторная работа №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;

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]