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

В блоке вычислений разрешено определение переменных, использование арифметических операций, а также условных операторов. Условные операторы имеют следующий формат:

? LE O [or O]

Допускается использование фигурных скобок для объединения нескольких операций в теле условного оператора, неполные операторы, а также любая глубина вложенности. Логическим выражением в условии может быть любое выражение, включающее в себя арифметические и логические операции. Разрешено также объединение несколько логических выражений с помощью операторов && (И) и || (ИЛИ).

Блок связей предназначен для определения соответствия переменных выхода и входа блоков программы. Связь определяется по следующему формату:

выход одного блока => вход другого блока, вход другого блока, вход другого блока …, где входы и выходы представляют собой:

<имя блока><-> / -^><имя входа/выхода>


4. Система регулярных выражений и формальная грамматика.

Лексика

.

 Имя автомата 

 Имя группы слов 

 Регулярное выражение 

 Действие 

 Примечание 

 main

 blockBegin

 [{]

 stack.push(lexAcceptor); lexAcceptor=lexAcceptors[findAutomat(«block»)];

 Скобка, открывающая блок. Переход к автомату «block». 

 Main

 blockEnd

 [}]

 Скобка, закрывающая блок. 

 Main

 comments

 other+

 ignoreLastWord=true;

 Комментарии. 

 Block

 blockBegin

 [{]

 stack.push(lexAcceptor);lexAcceptor=lexAcceptors[findAutomat(«block»)];

 Скобка, открывающая тело условного оператора. 

 Block

 blockEnd

 [}]

 lexAcceptor=(fAutomat)stack.pop();

 Скобка, закрывающая тело условного оператора. 

 Block

 id

 [a-zA-Z][0-9a-zA-Z]*

 if(Htid.get(Lexem.textOfWord.toString()) == null && Htwords.get(Lexem.textOfWord.toString()) == null){Lexem.wordIndex = Htid.size(); Htid.put(Lexem.textOfWord.toString(),Lexem);}

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

 Block

 int

 [0-9]+

 if(ignore.val() == false && Htint.get(Lexem.textOfWord.toString()) == null) {Lexem.wordIndex = Htint.size(); Htint.put(Lexem.textOfWord.toString(),Lexem);}

 Целочисленные константы, а также имена блоков. 

 Block

 float

 [0-9]+[.]([0-9])+

 if(Htfloat.get(Lexem.textOfWord.toString()) == null) {Lexem.wordIndex = Htfloat.size(); Htfloat.put(Lexem.textOfWord.toString(),Lexem);}

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

 Block

 op1

 [+-]

 VectPentadOp.add(Lexem.textOfWord);

 Операции суммы и разности. 

 Block

 op2

 [*/]

 VectPentadOp.add(Lexem.textOfWord);

 Операции умножения и деления. 

 Block

 relation

 ([=][=])|([!][=])|([<>])|([<][=])|([>][=])

 VectPentadOp.add(Lexem.textOfWord);

 Логические операции сравнения. 

 Block

 logic

 ([&][&])|([|][|])

 VectPentadOp.add(Lexem.textOfWord);

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

 Block

 in

 [-][>]

 Вход в блок. 

 Block

 out

 [-][^]

 Выход из блока. 

 Block

 join

 [=][>]

 Определение связи. 

 Block

 symbols

 [;L)]

 Служебные символы. 

 Block

 ignore

 [ \r\t\n]+

 ignoreLastWord=true;

 Служебные символы. 

 Block

 space