Обеспечение пробелов между токенами в pyparsing - PullRequest
1 голос
/ 30 марта 2019

Я пытаюсь создать простой интерпретатор lisp в Python, используя pyparsing. Я определил язык:

def parse(program):
    _int = pp.Word(pp.nums).setParseAction(lambda s, l, t: [int(t[0])])
    _float = pp.Combine(pp.Word(pp.nums) + '.' +
                        pp.Word(pp.nums)).setParseAction(lambda s, l, t: [float(t[0])])
    number = _int ^ _float

    extended_chars = "!$%&*+-./:<=>?@^_~"
    symbol = pp.Word(pp.alphas + extended_chars, pp.alphanums + extended_chars)

    atom = number ^ symbol
    _list = pp.Forward()
    _list << pp.nestedExpr(opener="(", closer=")", content=atom)
    exp = atom ^ _list

    return exp.parseString(program, parseAll=True).asList()

Это в основном работает, но анализирует:

parse('(1a)') => [[1, 'a']]

Что следует интерпретировать как неверный синтаксис. Я предполагаю, что это потому, что парсер не требует пробелов между токенами в nestedExpr. Как мне обеспечить интервал?

1 Ответ

0 голосов
/ 01 апреля 2019

Я не уверен, что вы действительно хотите использовать пробелы, разве «1 + 3» также не должно быть допустимым?

Вместо этого измените выражения Word, добавив аргумент ключевого слова asKeyword=True.

В качестве предостережения, nestedExpr - это очень простой анализатор, и если необходимо проанализировать и содержимое вложенного выражения, вам следует использовать рекурсивный анализатор или, возможно, infixNotation. Подробнее в этом ответе: Как мне реализовать это в ply, учитывая, как работает pyparsing

...