-
Notifications
You must be signed in to change notification settings - Fork 64
easyflow_parser
czen edited this page Oct 9, 2018
·
1 revision
disclaimer требования к заданию описаны не полностью и должны уточняться по ходу работы (git pull request, комментарии к коммитам, тестам и т.п.)
EasyFlow - язык описания композитных приложений, т.е. приложений, состоящих из других приложений, выполняемых в заданном порядке.
- Реализовать парсер подможества языка 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”]
);