Изучение конечных автоматов без памяти, способов определения КА – канонического, графового и табличного, методов построения недетерминированного КА по системе регулярных выражений, страница 9

//Part_2: определения используемых классов

class fAutomat extends fAutomatAsGraph{

 public fAutomat(int no,int stCnt,textReader tr){

  super(no,stCnt,tr);

 }

 public fAutomat(int stCnt,textReader tr){

  super(stCnt,tr);

 }

}

//end of Part_2

//Part_3: глобальные переменные

final TraceInfo ti=new TraceInfo();

//end of Part_3

//Part_4: лексический анализатор

class lexAnalyzer{

 fAutomat lexAcceptor;           //текущий (активный) лексический акцептор

 lexem Lexem=new lexem();           //текущая лексема

 boolean ignoreLastWord;           //флажок необходимости не возвращать (игнорировать) последнюю обнаруженную лексему

//Part_4_0: данные и методы из правил

Stack stack = new Stack();

class Record

 {

private int _index;

private String _text;

private boolean _isId;

private boolean _isConstBoolean;

private boolean _isConstSymbol;

private void _ResetType() {

_isId = false;

_isConstBoolean = false;

 _isConstSymbol = false;

}

public Record(String text)

 { _text = text; }

 public String GetType()

 {

String type = new String();

 if(_isId) type = "Id";

else if(_isConstBoolean)

type = "ConstBoolean";

 else if(_isConstSymbol) type = "ConstSymbol";

 else type = "Undefined";

 return type; }

public void IsId()

{

_ResetType();

 _isId = true;

}

public void IsConstBoolean()

{

_ResetType();

 _isConstBoolean = true;

 }

 public void IsConstSymbol()

{

 _ResetType();

 _isConstSymbol = true;

}

 public int GetIndex()

{ return _index; }

public String GetText() { return _text; }

 } // Конец класса 'Record'

class Table {

private int _size;

 private ArrayList<Record> _records;

 public Table()

{ _size = 0; _records = new ArrayList(); }

 public void Add(Record R)

{ if(this.Seach(R.GetText()) == null) _records.add(R); }

public Record Seach(String text)

{ for(Record r: _records)

 if(r.GetText().compareToIgnoreCase(text)==0)

return r; return null; }

 public String Info()

{

 String info = new String();

 info = info + "Id(";

for(Record r: _records)

 if(r.GetType().compareTo("Id") == 0) info = info + " " + r.GetText();

info = info + ") ConstBoolean("; for(Record r: _records)

 if(r.GetType().compareTo("ConstBoolean") == 0)

info = info + " " + r.GetText();

info = info + ") ConstSymbol("; for(Record r: _records)

 if(r.GetType().compareTo("ConstSymbol") == 0) info = info + " " + r.GetText();

info = info + ")";

return info;

 }

 }

 Record R;

Table T = new Table();

//end of Part_4_0

//Part_4_1: мультиавтоматный ЛА

 Stack lexStk=new Stack();           //стек индексов лексических акцепторов

 fAutomat[] lexAcceptors=new fAutomat[4];  //массив лексических акцепторов

//Part_4_2: конструктор мультиавтоматного ЛА

 public lexAnalyzer(textReader rdr){

  faState state;           //переменная для временного хранения состояния конечного автомата

//дальше идет создание автоматов, их состояний, выходящих из них дуг и запоминание всего этого в соответствующих местах

  lexAcceptors[0]=new fAutomat(0,26,rdr);

   state=new faState(12);

    state.setArc(1,"\n\r\u0009");

    state.setArc(2," ");

    state.setArc(3,"t");

    state.setArc(4,"f");

    state.setArc(5,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrsuvwxyzАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя");

    state.setArc(6,";");

    state.setArc(7,"0123456789");

    state.setArc(8,"(){}");

    state.setArc(9,"/");

    state.setArc(10,"+*-");

    state.setArc(11,"<");

    state.setArc(12,"\"");

   lexAcceptors[0].setState(0,state);

   state=new faState(2);

    state.setArc(-2,"");

    state.setArc(1,"\n\r\u0009");

   lexAcceptors[0].setState(1,state);

   state=new faState(2);