ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
10 июля
309681 Топик полностью
Д.ARMоед (23.02.2012 15:32, просмотров: 298) ответил Evgeny_CD на MPS, the Meta Programming System -> Довольно любопытная штука для построения DSL (Domain Specific Languages)
Интересно, как будет выглядеть АОН(к примеру) на энтом MPS? Написать программу декодирования телефонного номера для АОН. По запросу АОНа АТС посылает телефонный номер, используя следующие правила: - Если цифра повторяется менее двух раз, то это помеха и она должна быть отброшена - Каждая значащая цифра повторяется минимум два раза - Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий два или более подряд раз знак # Например, входящая строка 4434###552222311333661 соответствует номеру 4452136 "REFAL":
$ENTRY Go { = <Print<Convert_number (<Arg 1>) e.1>>; }
Convert_number {e.1 = <F4<F3<F2<F1 e.1>>>>;}
F1 {s.1 s.1 e.1 = s.1 <F1 e.1>; 
	s.1 e.1 = <F1 e.1>;
	        =;}
F2 {e.1 s.1 s.1 e.2 = <F2 e.1 s.1 e.2>; 
	        e.1 = e.1;}
F3 {e.1 s.1 '#' e.2 = <F3 e.1 s.1 s.1 e.2>; 
	        e.1 = e.1;}
F4 {'#' e.1 = <F4 e.1>; 
	e.1 = e.1;}

<Convert_number ('4434###552222311333661' (e.string))>;
"C++": void convert( char *in, char *res ) { char ch = 0; char prev = 0; while ( in && *in ) { if ( *in++ == ch ) { if ( ch != '#' ) prev = ch; if ( prev ) *res++ = prev; while ( *in++ == ch ) ; } ch = *( in - 1 ); } *res = 0; } MPS - ??? p.s.: процедурки стянуты с www.progz.ru