Я пытаюсь создать простой интерпретатор 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
. Как мне обеспечить интервал?