Совпадение символа определенное количество раз

#rascal

Вопрос:

При определении синтаксиса можно сопоставить 1 или более раз ( ) или 0 или более раз (*) аналогично тому, как это делается в регулярном выражении. Однако я не нашел в документации rascal, можно ли также сопоставлять символ определенное количество раз. В регулярных выражениях (и шаблонах мошенников) это делается с целым числом между двумя фигурными скобками, но это, похоже, не работает для определения синтаксиса. В идеале я бы хотел что-то вроде:

 lexical Line = [0-9.] ;
syntax Sym = sym: {Line Newline}{5};
 

Который будет пытаться соответствовать только первым 5 строкам текста ниже:

 ..0..
11.11
44.44
1.11.1
33333
55555
 

Ответ №1:

Нет, этого мета-синтаксиса в Rascal не существует. Мы его не добавляли.

Вы могли бы написать такую переоценку, и фильтр после анализа отклонит более 5 элементов:

 syntax Sym = fiveLines: (Line NewLine)  lines

visit (myParseTree) {
   case (Sym) `<(Line NewLine)  lines>` : 
      throw ParseError(x.src) when length(lines) != 5;
}
 

Или разверните петлю вот так:

 syntax Sym 
    =  Line NewLine
       Line NewLine
       Line NewLine 
       Line NewLine
       Line NewLine
    ;
 

Повторение с целочисленным параметром звучит как хороший запрос на функцию для нас, рассмотрите, если вам это очень нужно. Нам нужно только рассмотреть, что это значит для системы типов Rascal; для генератора синтаксического анализатора это простое правило для добавления.