Я работаю над презентацией про Nemerle.Peg для addconf2 и в процессе обнаружил, что некоторые регулярки со скрипом ложатся на peg нотацию. Это получается из-за того, что PEG (насколько я понял) не поддерживает квантификатор вида '{n}', поэтому простое регулярное выражение '\d{3}-\d{4}' приходиться раскрывать в
[PegGrammar(phone,grammar{
d : int = ['0'..'9'];
phone : string = d d d '-' d d d d;
})]
class PhoneParser
{
d(digit : NToken) : int { int.Parse(GetText(digit)) }
phone(a:int, b:int, c:int, _:NToken, d:int, e:int, f:int, g:int) : string
{
$"+7(812)$a$b$c-$d$e$f$g"
}
}
С таким подходом немного стыдно говорить о PEG как об альтернативе регулярным выражениям, было бы намного удобнее иметь возможность писать так:
[PegGrammar(phone,grammar{
d = ['0'..'9'];
phone : string = d{3} '-' d{3};
})]
class PhoneParser
{
phone(a : NToken, _ : NToken, b : NToken) : string
{
$"+7(812)$(GetText(a))-$(GetText(b))"
}
}
Мне кажется, что такой подход нужен для того, чтобы заметить почти всюду использование Regex на Nemerle.Peg. К сожалению, для меня сейчас приоритет — подготовить презентацию, поэтому не могу заняться реализацией этого комбинатора, будет здорово, если кто-нибудь возьмется за нее, а смогу с чистой совестью рекламировать Nemerle.Peg на addconf, в том числе и как альтернативу регулярным выражениям.