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

  charToI2.addRange('\'','\'',1);

  charToI2.addRange('0','0',1);

  charToI2.addRange('\\','\\',1);

  charToI2.addRange('n','n',1);

  charToI2.addRange('r','r',1);

  charToI2.addRange('t','t',1);

  charToI3.addRange('\'','\'',1);

  charToI3.addRange('A','Z',2);

  charToI3.addRange('a','z',2);

  charToI3.addRange('А','я',2);

  charToI3.addRange('\\','\\',3);

//создадим все лексические акцепторы

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

  lexAcceptors[0].setOther(0);

  lexAcceptors[1]=new fAutomat(1,charToI1,controlTable1,rdr);

  lexAcceptors[1].setOther(1);

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

  lexAcceptors[2].setOther(0);

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

  lexAcceptors[3].setOther(0);

  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;

    case -4: //error

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

    }

    break;

   }

  }

  return Lexem;

 }

}

//end of Part_4

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

class parser{

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

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

int cCnt=0;