Nemerle.Peg как альтернатива Regexp'ам
От: Рысцов Денис  
Дата: 20.04.11 13:09
Оценка:
Я работаю над презентацией про 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, в том числе и как альтернативу регулярным выражениям.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.