Я реализую язык, в котором переводы строк значимы, иногда, как и в Python, с точно такими же правилами.
Для целей моего вопроса мы можем взять фрагмент Python, который имеет делать с заданиями, круглыми скобками и обработкой символов новой строки и точек с запятой.
Например, можно написать:
a = 1 + 2 + 3 # ok
b = c
, но не
a = 1 + 2 + 3 b = c # incorrect
, потому что один нужна новая строка для разделения двух операторов.
Однако мы можем использовать
a = 1 + 2 + 3; b = c # ok
, используя точку с запятой.
Также не допускается иметь
a = 1 + 2 + # incorrect
3
b = c
, потому что в выражении не может быть разрывов строк.
Однако, возможно иметь
a = 1 + 2 + ( # ok
3)
b = c
или
a = 1 + 2 + \ # ok
3
b = c
Я пытался для реализации вышеуказанных правил, но я застрял.
Во-первых, я использую
ParserElement.setDefaultWhitespaceChars(' \t')
, так что теперь \n
значимо.
Мне удается навязать хорошо символы новой строки в качестве разделителя, использующие
lines = ZeroOrMore(line + OneOrMore(LineEnd()))
. Вариант этого позволяет иметь ;
в качестве разделителя, как мы LL. (Я не могу разобраться с дополнительной скобкой \
.)
Я использую infixNotation
для определения +
, -
, /
, *
.
. Часть, с которой я застрял, заключается в том, что внутри парантезов должны игнорироваться символы новой строки, как в этом случае:
a = 1 + 2 + (
3 +
1)
Я думаю, что здесь что-то, что может сыграть роль, использует setWhitespaceChars
в выражении скобок (LPAR + term + RPAR)
что infixNotation генерирует, однако, что не работает, потому что пробельные символы не наследуются нижними выражениями.
У кого-нибудь есть подсказка?
Мой вопрос также может быть выражен как "как мне разобрать (фрагмент) Python с pyParsing?". Я думал, что смогу найти пример проекта, но не смог. Гугля, я видел, как люди ссылались на примеры в репозитории pyParsing, однако parsePythonValue.py
- это анализ значений (что я уже могу сделать), а не работа со значительными символами новой строки, а pythongGrammarParsing.py
- анализ грамматики BNF для * 1066. * не разбирается Python.