Пред.Страница След.Страница  Раздел Содержание


7.9. Реализация АТ-преобразователя

Процесс проектирования программной системы завершается созданием кода на языке программирования. В качестве примера реализации преобразователя на языке java, ниже приведен текст описания класса Parser. Чтобы сократить размер описания, из него исключен метод, выполняющий вывод результатов работы преобразователя. Приведенное описание реализует схему работы преобразователя, изображенную на рисунке 7.5.

Моделирование работы преобразователя реализуется методом main, в теле которого находится цикл while, обеспечивающий повторение тактов. В каждом такте работы читается символ из вершины магазина и определяется его тип. Затем оператор switch выполняет активизацию действий, предписанных правилами работы преобразователя.

Второй метод executeAction, описанный в классе Parser, связывает  каждый символ действия с соответствующим ему методом

 

package converter;

 

public class Parser implements MagazineSymbolsName

{

  public static Token tkn;

  public static int vtype = 0;

 

  public static void executeAction(Magazine mg1, LexTab lext, FunTab fft, ValueTable tl, VariableTable tr, AtomTable ta, MagazineSymbol ms, Token tk) throws ParsExcetption{

 

       switch(ms.getIndex()){

       case MAS:{ta.makeASS(mg1, tr, lext, tl); break;}

       case MAD:{ ta.makeAND(mg1, tr, lext, tl); break;}

       case MOR:{ ta.makeOR(mg1, tr, lext, tl); break;}

       case MNT:{ ta.makeNOT(mg1, tr, lext, tl); break;}

       case MVR:{ tr.makeVariable(lext, tk.getIndex(), tl, mg1); break; }

       case STP:{ vtype = ta.setType(mg1, lext);  break;}

       case CVR:{ tr.checkVariable( mg1, tk.getIndex()); break;}

       case PAT:{ ta.passAtribute(mg1); break;}

       case CKW:{tr.makeValue(mg1, lext, tk.getIndex() ,tl); break;}

       case RAT:{ mg1.pop(); break;}

       default: throw new ParsExcetption("executeAction: Impossble symbol !");

       }

     }

 

public static void printResults(LexTab ltlt, VariableTable trtr, AtomTable tata){

  String ss;

  int k, m;

  System.out.println("----------Lex Table--------                   ----------------TVR---------------");

  System.out.println();

  for (int i = 0; i <= LexTab.markLT; i++) {

    ss = ltlt.getElementLT(i);

    System.out.print("          i=" + i + "  " + ss);

    m = 20 - ss.length();

    k = (i < 10) ? m : m - 1;

    for (int j = 0; j < k; j++) System.out.print(" ");

    if (i < VariableTable.finger)

      System.out.print("          pLexTab= " + trtr.getpointerLexTab(i) + "  " +

                       "pTVL= " + trtr.getIndexTVL(i)

                       + "  " + "type= " + trtr.getType(i) + "  " +

                       "hasvalue= " + trtr.getHasvalue(i) + "  " + "useing = " +

                       trtr.getUseing(i));

    System.out.println();

  } //end for

  System.out.println();

  tata.printTAtom();

  System.out.println();

  for (int n = 2; n < VariableTable.finger; n++) {

    if (trtr.getHasvalue(n) == 0)

      System.out.println(" Значение переменной  " +

                         ltlt.getElementLT(trtr.getpointerLexTab(n))+ " не определено");

    if (trtr.getUseing(n) == 0)

    System.out.println(" Переменная  " +

                         ltlt.getElementLT(trtr.getpointerLexTab(n))+ " не используется");

  }

}

  public static void main(String[] args) {

    Lexer lxr = new Lexer(args[0]);

    FunTab ft = new FunTab();

    TsrminalTable ts = new TsrminalTable();

    ValueTable tval = new ValueTable();

    VariableTable tvar = new VariableTable();

    AtomTable tat = new AtomTable();

    Parser pr = new Parser();

    Magazine mg = new Magazine();

    mg.push(new MagazineSymbol(5,1));

    MagazineSymbol ms;

      LexTab lxt = lxr.getLexTab();

      tkn = lxr.getnextToken();

     ms = mg.pop();

    while(ms != MagazineSymbol.MGnull){

      try{

        int q = ms.getType();

        switch(q){

          case Identifier:if ((tkn.getType() == 'I')& (ms.getType() == 1)){

              break; }

              else throw new ParsExcetption("Parser.case1: Несовпадение терминалов");

 

 

          case Keyword: if(((tkn.getType() == 'K')& (ms.getType() == 3)&

                           (tkn.getIndex() == ms.getIndex()))) break;

            else throw new ParsExcetption("Parser.case3: Недопустимое ключевое слово ");

 

          case Symbol: if (tkn.getIndex() == ms.getIndex()) {

              tkn = lxr.getnextToken();

              break; }

              else throw new ParsExcetption("Parser.case4: Несовпадение терминалов !");

 

            case Nonterminal: {

              ft.moveInstruction(mg, ms.getIndex());

              break; }

 

            case ActionSymbol:{

              executeAction(mg, lxt, ft, tval, tvar,tat, ms, tkn);

              break; }

 

            case Atribute:{ break;}

 

            case Link:{ throw new ParsExcetption("Parser case 8; Reference at the top !"); }

 

            case Read  :{ tkn = lxr.getnextToken();  break; }

 

            default: {throw new ParsExcetption("ParsA, default:  Impossible  MGsym !");}

        }//end switch

     }//end try

      catch(ParsExcetption e){ System.out.println("ParsException : "+e.getMessage());System.exit(0);}

   if(mg.empty())break; else ms = mg.pop();

  }//end while

  if(tkn != Token.Toknull) System.out.println("Магазин пуст, а вход нет!");

        else System.out.println(" FIN !");

  printResults(lxt, tvar, tat);

}//end main

 

}//end class

 

 

Определение всех классов, написанных на языке java и входящих в состав пакета converter, можно найти в файле java_converter. Этот файл можно скопировать, а чтобы проверить работу преобразователя нужно вначале откомпилировать исходные файлы пакета с помощью javac , а заем запустить класс Parser с помощью интерпретатора java, указав в качестве параметра имя текстового файла, содержащего тестовый пример.

 


Пред.Страница След.Страница  Раздел Содержание