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

final Vector VectPentadOp = new Vector(); //вектор для хранения используемых в программе знаков

       //операций

final Vector VectPentadMarks = new Vector(); //вектор для хранения имён используемых в

//программе меток

final Stack StPentad = new Stack(); //стек для хранения текущего слова ПФЗ

Ниже приведён программный код алгоритма:

Object Mark = (Object)(new String(""));

for (int i=0; i<VectPFRBlock.size(); i++)

{

    StPentad.push(VectPFRBlock.get(i));

    if (StPentad.peek()=="let")

    {

        VectPentadString.add(Mark);

        VectPentadString.add(StPentad.pop());

        VectPentadString.add(StPentad.pop());

        VectPentadString.add("null");

        VectPentadString.add(StPentad.pop());

        VectPentadBlock.add(VectPentadString.clone());

        VectPentadString.removeAllElements();

        Mark = (Object)(new String(""));

    }

    else if (VectPentadOp.contains(StPentad.peek())==true)

    {                           

        VectPentadString.add(Mark);

        VectPentadString.add(StPentad.pop());

        VectPentadString.add(StPentad.pop());

        VectPentadString.add(StPentad.pop());

        StPentad.push("tmpValue"+HTid.size());

        lexem tmp = new lexem();

        tmp.wordIndex = HTid.size();

        HTid.put(StPentad.peek(),tmp);

        VectPentadString.add(StPentad.peek());

        VectPentadBlock.add(VectPentadString.clone());

        VectPentadString.removeAllElements();

        Mark = (Object)(new String(""));

    }

    else if (VectPentadMarks.contains(StPentad.peek())==true && (i+1==VectPFRBlock.size() || (i+1<VectPFRBlock.size() && VectPentadMarks.contains(VectPFRBlock.get(i+1))==true)))

    {

        VectPentadString.add(StPentad.pop());

        VectPentadString.add("null");

        VectPentadString.add("null");

        VectPentadString.add("null");

        VectPentadString.add("null");

        VectPentadBlock.add(VectPentadString.clone());

        VectPentadString.removeAllElements();   

    }

    else if (VectPentadMarks.contains(StPentad.peek())==true) Mark = (Object)(StPentad.pop());

    else if (StPentad.peek()=="JmpF")

    {

        VectPentadString.add(Mark);

        VectPentadString.add(StPentad.pop());

        VectPentadString.add(StPentad.pop());

        VectPentadString.add(StPentad.pop());

        VectPentadString.add("null");

        VectPentadBlock.add(VectPentadString.clone());

        VectPentadString.removeAllElements();

        Mark = (Object)(new String(""));

    }

    else if (StPentad.peek()=="Jmp")

    {

        VectPentadString.add(Mark);

        VectPentadString.add(StPentad.pop());

        VectPentadString.add(StPentad.pop());

        VectPentadString.add("null");

        VectPentadString.add("null");

        VectPentadBlock.add(VectPentadString.clone());

        VectPentadString.removeAllElements();

        Mark = (Object)(new String(""));

    }

}

VectPentadTotal.add(VectPentadBlock.clone());

VectPentadBlock.removeAllElements();

VectPentadOp.removeAllElements();

10.2. Результаты работы.

Последовательность пентад

Блок: 11

 Номер 

 Метка 

 Операция 

 Операнд1 

 Операнд2 

 Результат 

0

 let 

 5 

 null 

 a1 

1

 + 

 10.3 

 a 

 tmpValue5 

2

 * 

 2 

 tmpValue5 

 tmpValue6 

3

 let 

 tmpValue6 

 null 

 b1 

4

 / 

 a 

 b 

 tmpValue7 

5

 let 

 tmpValue7 

 null 

 c1