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

return info;

 }

 }

 Record R;

Table T = new Table();

//end of Part_6_0

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

 public lexAnalyzer(textReader rdr){

  inp=rdr;           //запомним указатель входного потока

//далее для каждого автомата создадим требуемые совокупности диапазонов литер

  charToI0.addRange('\u0009','\n',1);

  charToI0.addRange('\r','\r',1);

  charToI0.addRange(' ',' ',2);

  charToI0.addRange('\"','\"',3);

  charToI0.addRange('(',')',4);

  charToI0.addRange('{','{',4);

  charToI0.addRange('}','}',4);

  charToI0.addRange('*','*',5);

  charToI0.addRange('+','+',6);

  charToI0.addRange(',',',',7);

  charToI0.addRange('-','-',8);

  charToI0.addRange('/','/',9);

  charToI0.addRange('0','9',10);

  charToI0.addRange(';',';',11);

  charToI0.addRange('<','<',12);

  charToI0.addRange('A','Z',13);

  charToI0.addRange('b','d',13);

  charToI0.addRange('g','k',13);

  charToI0.addRange('m','q',13);

  charToI0.addRange('v','z',13);

  charToI0.addRange('А','я',13);

  charToI0.addRange('a','a',14);

  charToI0.addRange('e','e',15);

  charToI0.addRange('f','f',16);

  charToI0.addRange('l','l',17);

  charToI0.addRange('r','r',18);

  charToI0.addRange('s','s',19);

  charToI0.addRange('t','t',20);

  charToI0.addRange('u','u',21);

  charToI1.addRange('\"','\"',1);

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

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

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

  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(1);

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

  lexAcceptors[3].setOther(1);

  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;