#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; для генератора синтаксического анализатора это простое правило для добавления.