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

Условие имеет следующую структуру: (<выражение><знак сравнения><выражение>)

            В языке возможно использование вещественных положительных констант и положительных целых констант. Отрицательные значения получаются в результате выполнения арифметических действий. Выражение представляет собой правильное математическое сочетание знаков операции -, +, *, /, идентификаторов и констант. Знаки операции имеют следующий приоритет (по убыванию): *(/), +(-). В выражения возможно использование скобок для изменения порядка выполнения операций.

            Признаком конца текущего оператора является символ «;». Одиночное использование этого символа, без предшествующего ему оператора, недопустимо.

            К семантики заданного языка предъявляются следующие требования:

·  уникальность имени блока;

·  недопустимость присвоения значения переменной самой себе;

·  недопустимость передачи значений с выхода на вход одного и того же блока;

·  недопустимость передачи значений на входы блоков типа vars;

·  недопустимость передачи значений не идентифицированному блоку или передачи значений из не идентифицированного блока;

·  соответствие имён блоков и имён идентификаторов, заданных в блоках связей, таблицам идентификаторов;

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


Пример тестовой программы

{1vars1:vars;

let a1 let a2 2;

let b 2;

}

{1join1:join;

1vars1 _o_ a1 -> 1do1 _i_ x1;

1vars1 _o_ a2 -> 3do3 _i_ x42;

1vars1 _o_ b  ->  1do1 _i_ x2, 3do3 _i_ x43;

1do1 _o_ out1 -> 3do3 _i_ x41, 2do2 _i_ v3v2;

}

{1do1:do;

{2vars2_o_ c -> 1do1 _i_ x3;

2vars2_o_ d -> 1do1_i_ x4;}

let in1 x1+x2;

let in2 x3+x4;

if (in1>in2)  let out1 in1-in2;

if (in1<in2) { let out1 in2-in1; }

else { let out1 0;}

}

{2do2:do;

let in1 v3v1+v3v2;

let in2 v3v1-v3v2;

if (in1 > in2) { let stek1 in1;}

else  if (in2 >= in1)  let stek1 in2;

if (v3v1*v3v2 > stek1)  let stek1 v3v1*v3v2;

if(v3v2/v3v1 > stek1) { let stek1 v3v2/v3v1;}

let out1 stek1;

}

{3do3:do;

if (x41 >= 4) { let out41 (x42+x43+x44+x45)/4;}

else if (x41 == 0)  let out41 x42*x43*x44*x45;

         else  let out41 (x42+x43+x44+x45)/x41;

}

{2join2:join;

2vars2_o_ c -> 3do3_i_ x44;

2vars2_o_ d -> 3do3_i_ x45;

3do3_o_ out41 -> 2do2 _i_ v3v1;

}

{4do4:do;

{ 2do2 _o_ out1 -> 4do4_i_ x51, 4do4_i_ x52;}

if (x51==0) { let out1 0;}

else { if (x51 >0) { let out1 1;}

          else { let out1 0.5;} }

let new x52*8/(2*x52+1);

if (new==0)

          {let out2 0;

          if(x51==5) let out3 5;}

else { if (new <0) { let out2 0.5;}

          else  let out2 1; }

}

{2vars2:vars;

let c 3;

let d 3;}


Система регулярных выражений

Лексика

.