在pyparsing中强制标记之间的空格

时间:2019-03-30 03:39:25

标签: python pyparsing

我正在尝试使用pyparsing在Python中构建一个简单的lisp解释器。我已经定义了语言:

def username_input(user):
    while len(user) > 12 or not (user.isalnum()):
        print("Error: the username must be an alphanumeric value \nand have as maximum 12 characters")
        user = input("Type a valid username: ")
    return user

这通常可以正常工作,但是可以解析:

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']] 中的令牌之间不需要空格。如何设置间距?

1 个答案:

答案 0 :(得分:0)

我不确定您是否真的想强制使用空格,'1 + 3'也不应该有效吗?

相反,通过添加asKeyword=True关键字参数来修改Word表达式。

为谨慎起见,nestedExpr是一个非常简单的解析器,如果还要解析嵌套表达式的内容,则应该使用递归解析器,或者可能使用infixNotation。进一步了解此答案:How do I implement this in ply, given how pyparsing works