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


Синтаксис

 Левая часть 

 Правая часть 

 Примечание 

BLOCK 

 StIf.push (new Integer(0)); ignore.t();

{

 VectNames.add(currentLexem.textOfWord);

 int

 ignore.f();

 :

 BLOCKTYPE

 }

 BLOCK

 Общая структура блока.

BLOCK 

BLOCKTYPE 

 vars

 ;

 BODYVARS

 PENTAD

 VectPFRTotal.add(VectPFRBlock.clone()); VectPFRBlock.removeAllElements();

 Внутренняя структура блока vars.

BLOCKTYPE 

 do

 ;

 BODYDO

 PENTAD

 VectPFRTotal.add(VectPFRBlock.clone()); VectPFRBlock.removeAllElements();

 Внутренняя структура блока do.

BLOCKTYPE 

 join

 ignore.t(); VectNames.remove(VectNames.size()-1);

;

 BODYJOIN

 ignore.f();

 Внутренняя структура блока join.

BODYVARS 

 let

 VectPFRBlock.add(currentLexem.textOfWord);

 id

 EXP

 VectPFRBlock.add("let");

 ;

 BODYVARS

 Оператор присваивания в блоке vars

BODYVARS 

EXP 

 U

 R

 Арифметическое выражение.

 StOp.push (currentLexem.textOfWord);

 op1

 EXP

 VectPFRBlock.add(StOp.pop ());

 Операции [+-].

 V

 W

 StOp.push (currentLexem.textOfWord);

 op2

 U

 VectPFRBlock.add(StOp.pop ());

 Операции [*/].

 (

 EXP

 )

 Использование скобок.

 VectPFRBlock.add(currentLexem.textOfWord);

 id

 Идентификатор.

 VectPFRBlock.add(currentLexem.textOfWord);

 float

 Константа с плавающей точкой.

 VectPFRBlock.add(currentLexem.textOfWord);

 int

 Целочисленная константа.

BODYDO 

 let

 VectPFRBlock.add(currentLexem.textOfWord);

 id

 EXP

 VectPFRBlock.add("let");

 ;

 BODYDO

 Оператор присваивания в блоке do.

BODYDO 

 ?

 EXP

 StOp.push (currentLexem.textOfWord);

 relation

 EXP

 VectPFRBlock.add(StOp.pop ());

 IF

 StIf .push (new Integer(++CntIf)); VectPFRBlock.add("Label1_"+StIf.peek()); VectPFRBlock.add("JmpF");

IFBODY

 VectPFRBlock.add("Label2_"+StIf.peek()); VectPFRBlock.add("Jmp");

 ELSE

 BODYDO

 Общая структура условного оператора.

BODYDO 

IF 

 StOp.push (currentLexem.textOfWord);

 logic

 EXP

 StOp.push (currentLexem.textOfWord);

 relation

 EXP

 VectPFRBlock.add(StOp.pop ()); VectPFRBlock.add(StOp.pop ());

IF

 Объединение логических выражений в условном операторе.

IF 

IFBODY 

 {

 BODYDO

 }

 Тело условного оператора (несколько операций).

IFBODY 

 let

 VectPFRBlock.add(currentLexem.textOfWord);

 id

 EXP

 VectPFRBlock.add("let");

 ;

 Тело условного оператора (операция присваивания).

IFBODY 

 ?

 EXP

 StOp.push (currentLexem.textOfWord);

 relation

 EXP

 VectPFRBlock.add(StOp.pop ());

 IF

 StIf .push (new Integer(++CntIf)); VectPFRBlock.add("Label1_"+StIf.peek()); VectPFRBlock.add("JmpF");

IFBODY

 VectPFRBlock.add("Label2_"+StIf.peek()); VectPFRBlock.add("Jmp");

 ELSE

 Вложенный условный оператор.

ELSE 

 or

 VectPentadMarks.add("Label1_"+StIf.peek()+":"); VectPFRBlock.add(VectPentadMarks.lastElement());

IFBODY

 VectPentadMarks.add("Label2_"+StIf.pop()+":"); VectPFRBlock.add(VectPentadMarks.lastElement());

 Альтернатива условного оператора.

ELSE 

 or

 VectPentadMarks.add("Label1_"+StIf.pop()+":"); VectPFRBlock.remove(VectPFRBlock.size()-1); VectPFRBlock.remove(VectPFRBlock.size()-1); VectPFRBlock.add(VectPentadMarks.lastElement());

 Неполный условный оператор (альтернатива отсутствует).

BODYJOIN 

 int

 out

 id

 =>

 int

 in

 id

 JOIN

 ;

 BODYJOIN

 Определение связей в блоке join.

BODYJOIN 

JOIN 

 ,

 int

 in

 id

 JOIN

 Расширенное определение связей.

JOIN 

PENTAD 

 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 (i+1==VectPFRBlock.size() || i+1<VectPFRBlock.size() && VectPentadMarks.contains(StPentad.peek())==true && 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();

 Преобразование постфиксной записи в последовательность пентад.