|
|
|
**disclaimer** требования к заданию описаны не полностью и должны уточняться по ходу работы (git pull request, комментарии к коммитам, тестам и т.п.)
|
|
|
|
|
|
|
|
EasyFlow - язык описания композитных приложений, т.е. приложений, состоящих из других приложений, выполняемых в заданном порядке.
|
|
|
|
|
|
|
|
### 40 баллов
|
|
|
|
|
|
|
|
- Реализовать парсер подможества языка EasyFlow:
|
|
|
|
|
|
|
|
Упрощенная грамматика языка:
|
|
|
|
|
|
|
|
```
|
|
|
|
Программа ::= {ВходныеДанные} {АтрибутWF} {({Комментарий}|{ОписаниеБлока})}
|
|
|
|
Комментарий ::= "//" Строка
|
|
|
|
ВходныеДанные ::= require
|
|
|
|
СписокИдентификаторов ";"
|
|
|
|
АтрибутWF ::= "{" flow ":"
|
|
|
|
Идентификатор "=" Выражение "}"
|
|
|
|
ОписаниеБлока ::= {Атрибут} (step|~step) Идентификатор runs КомпозитныйИдентификатор [after СписокИдентификаторов] СписокПараметров [ ПостОбработка ] ";"
|
|
|
|
КомпозитныйИдентификатор ::= { Идентификатор [Точка] }
|
|
|
|
СписокИдентификаторов ::= { Идентификатор [ "," ] }
|
|
|
|
Атрибут ::= "[" Идентификатор "=" Выражение "]"
|
|
|
|
СписокПараметров ::= "(" {(Параметр|Порт)[,]} ")"
|
|
|
|
Параметр ::= Идентификатор "=" Выражение
|
|
|
|
Порт ::= Идентификатор "<-" ПолеОбъекта
|
|
|
|
ПостОбработка ::= post code ruby КодRuby code end
|
|
|
|
Выражение ::= Строка | ЦелоеЧисло | ДробноеЧисло | Список | БулеваКонст | Идентификатор | Кон-станта | ПолеОбъекта
|
|
|
|
Константа ::= ‘@’ Идентификатор
|
|
|
|
ПолеОбъекта ::= КомпозитныйИдентификатор [ "[" Выражение "]" ]
|
|
|
|
Идентификатор ::= ('a'..'z'|'A'..'Z'|'_') {('a'..'z'|'A'..'Z'|'0'..'9'|'_')}
|
|
|
|
ЦелоеЧисло ::= [('+'|'-')] {('0'..'9')}
|
|
|
|
ДробноеЧисло ::= [('+'|'-')] '.' {('0'..'9')} [('e'|'E') [('+'|'-')] ('0'..'9') {('0'..'9')}]
|
|
|
|
БулеваКонст ::= ('true' | 'false')
|
|
|
|
Список ::= '[' { Выражение [ "," ] } ']'
|
|
|
|
```
|
|
|
|
|
|
|
|
Пример:
|
|
|
|
|
|
|
|
```
|
|
|
|
require file1, file2;
|
|
|
|
step AnotherStep runs EmptyPackage ();
|
|
|
|
|
|
|
|
[priority = @high]
|
|
|
|
step StepName runs Package.Method after AnotherStep
|
|
|
|
(
|
|
|
|
inFile1 = file1,
|
|
|
|
inFile2 = file2,
|
|
|
|
stringInput = "some string here",
|
|
|
|
intInput = 100,
|
|
|
|
doubleInput = 3.14,
|
|
|
|
sweepParam = sweep [1, 2, 3],
|
|
|
|
listParam = [AnotherStep.outs["out.txt"]]
|
|
|
|
)
|
|
|
|
post code ruby
|
|
|
|
i = 1
|
|
|
|
list = StepName.Result.outs
|
|
|
|
list.reverse
|
|
|
|
code end
|
|
|
|
|
|
|
|
~step LongRunningStep runs LRPackage
|
|
|
|
(
|
|
|
|
inStream <- StepName.Result.outs[“output.txt”]
|
|
|
|
);
|
|
|
|
``` |