Как структурировать функции рекурсивного спуска с точки зрения совместного использования кода? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть грамматика, которая содержит:

constant ::= integer-literal
| char-literal
∣ string-literal

expression ::= constant

pattern ::= constant | char-literal .. char-literal

Я только что приступил к разбору с рекурсивным спуском и мне было интересно, как структурировать мой код для повторного использования синтаксического анализа constant.Проблема в том, что когда я вижу char-literal, я не могу просто проанализировать константу в pattern.Если следующий токен - .., это другой тип шаблона.

Представьте себе следующий код:

let parseConstant p =
  match p.token with
  | Int i -> Const_int (int_of_string i)
  | String s -> Const_string (s, None)
  | Char c -> Const_char c

Как бы я структурировал parseExpression и parsePatternфункция для повторного использования parseConstant?Или я просто создаю другую parsePatternConstantMaybeDotDotOtherGrammarThing функцию для шаблонов?

1 Ответ

0 голосов
/ 08 декабря 2018

Что я мог бы сделать, это иметь код для pattern звоните parseConstant.Тогда посмотрите на следующий токен.Если это .., то, если константа является символьной константой, вы можете проанализировать остальную часть диапазона символов.Если константа не является символьной константой, у вас есть синтаксическая ошибка.Если следующий токен не .., вы закончили анализ вашего паттерна.

Причина, по которой синтаксические анализаторы с рекурсивным спуском имеют низкое напряжение, заключается в том, что вы можете напрямую кодировать любые нечетные случаи.Вам не нужно делать их подходящими для структуры синтаксического анализа - это всего лишь код.Цена, которую нужно заплатить, заключается в том, что вы должны написать код и быть осторожным, чтобы сделать его правильно.

...