Skip to content

easyflow_parser

czen edited this page Oct 9, 2018 · 1 revision

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”] 
);

Clone this wiki locally