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

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

  lexAcceptors[2]=new fAutomat(2,2,rdr);

   state=new faState(1);

    state.setArc(1,"0ntr\'\\");

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

   state=new faState(1);

    state.setArc(-2,"");

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

  lexAcceptors[3]=new fAutomat(3,4,rdr);

   state=new faState(4);

    state.setArc(-1,"");

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

    state.setArc(2,"\'");

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

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

   state=new faState(1);

    state.setArc(-3,"");

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

   state=new faState(1);

    state.setArc(-4,"");

   lexAcceptors[3].setState(2,state);

   state=new faState(2);

    state.setArc(-2,"");

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

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

  lexAcceptor=lexAcceptors[0];           //установим автомат с индексом 0 в качестве стартового лексического акцептора

  lexStk.push(lexAcceptor);           //и запомним это в стеке

 }

//Part_4_3: распознавание слова и формирование лексемы

 public lexem getLexem(){

  if(lexStk.size()<=0){           //если стек пуст - вернуть лексему с ошибкой

   Lexem.groupIndex=-2147483647;return Lexem;

  }

  ignoreLastWord=true;           //временно установим флажок, чтобы войти в цикл

  while(ignoreLastWord){           //пока флажок установлен - читаем очередное слово (игнорируя предыдущие, если цикл выполняется более одного раза)

   ignoreLastWord=false;           //перед чтением следующего слова сбросим флажок

//вызовем лексический акцептор и получим от него лексему:

   Lexem=lexAcceptor.getLexem();

//для каждого автомата и каждой группы слов обеспечим возможность выполнения действий (имена автоматов и групп слов в примечаниях)

//индексы групп слов, имена которых используются в грамматике, преобразуются в те значения, который присвоил им построитель синтаксического акцептора

//в действиях, в частности, может быть взведен флажок ignoreLastWord и изменены поля лексемы, установленные акцептором

   switch(lexAcceptor.getIndex()){

   case 0:           // Автомат main

    switch(Lexem.groupIndex){

    case -1: //EOF

     Lexem.groupIndex=0;break;

    case -2: //operator

     break;

    case -3: //words

     break;

    case -4: //operator Delimiter

     break;

    case -5: //Decconst

     break;

    case -6: //UseLessWord

     ignoreLastWord=true;break;

    case -7: //CharConstBegin

     ignoreLastWord=true;stack.push(lexAcceptor); lexAcceptor=lexAcceptors[3]; /*ti.put(0,0, "Push");*/break;

    case -8: //Brackets

     break;

    case -9: //id

     break;

    case -10: //floatconst

     break;

    }

    break;

   case 1:           // Автомат endsymbolic

    switch(Lexem.groupIndex){

    case -1: //EOF

     Lexem.groupIndex=0;break;

    case -2: //Error

     Lexem.groupIndex=codeCharError; ti.put(0,0,"char error");break;

    case -3: //CharConstEnd

     lexAcceptor=(fAutomat)stack.pop();break;

    }

    break;

   case 2:           // Автомат specialsymbolic

    switch(Lexem.groupIndex){

    case -1: //EOF

     Lexem.groupIndex=0;break;

    case -2: //constchar

     /*ti.put(0,0, "go to endsymbolic from specialsymbolic");*/ Lexem.textOfWord=new StringBuffer("\\"+Lexem.textOfWord.toString()); lexAcceptor=lexAcceptors[1];break;

    }

    break;

   case 3:           // Автомат symbolic

    switch(Lexem.groupIndex){

    case -1: //EOF

     Lexem.groupIndex=0;break;

    case -2: //charconst

     /*ti.put(0,0, "go to endsymbolic");*/ lexAcceptor=lexAcceptors[1];break;

    case -3: //slash

     ignoreLastWord=true;lexAcceptor=lexAcceptors[2]; /*ti.put(0,0, "go to specialsymbolic");*/break;