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

   state=new faState(2);

    state.setArc(1,"");

    state.setArc(2,"/");

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

   state=new faState(1);

    state.setArc(-2,"");

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

   state=new faState(1);

    state.setArc(-3,"");

   lexAcceptors[3].setState(2,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: //spaces

     ignoreLastWord=true;break;

    case -3: //delimiter

     break;

    case -4: //cinteger

     break;

    case -5: //brackets

     break;

    case -6: //arith

     break;

    case -7: //StartString

     ignoreLastWord=true;stack.push(lexAcceptor);lexAcceptor=lexAcceptors[1];break;

    case -8: //CommBegin

     ignoreLastWord=true;stack.push(lexAcceptor);lexAcceptor=lexAcceptors[2];break;

    case -9: //id

     ti.put(Lexem.groupIndex,Lexem.textOfWord+" Идентификатор");break;

    case -10: //cdouble

     break;

    case -11: //cbool

     break;

    case -12: //dfdfsadf

     break;

    }

    break;

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

    switch(Lexem.groupIndex){

    case -1: //EOF

     Lexem.groupIndex=0;break;

    case -2: //other

     ti.put(Lexem.groupIndex,Lexem.textOfWord);break;

    case -3: //EndString

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

    }

    break;

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

    switch(Lexem.groupIndex){

    case -1: //EOF

     Lexem.groupIndex=0;break;

    case -2: //other

     ignoreLastWord=true;ti.put(Lexem.groupIndex,Lexem.textOfWord);break;

    case -3: //star

     ignoreLastWord=true;stack.push(lexAcceptor);lexAcceptor=lexAcceptors[3];break;

    }

    break;

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

    switch(Lexem.groupIndex){

    case -1: //EOF

     Lexem.groupIndex=0;break;

    case -2: //other

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

    case -3: //slash

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

    }

    break;

   }

  }

//вернем лексему

  return Lexem;

 }

}

//end of Part_4

//Part_6: синтаксический акцептор/анализатор

class parser{

lexAnalyzer la;           //экземпляр лексического анализатора

lexem currentLexem;           //текущая лексема

int cCnt=0;

//Part_6_4: заглушка для случая, когда нет синтаксических правил

 public parser(String s){

  la=new lexAnalyzer(new textReader(s));           //создание экземпляра лексического анализатора

 }

 private int getWordIndex(){

  currentLexem=la.getLexem();

  return currentLexem.groupIndex;

 }

 public String getStatistic(int i){

  if(i==0)