我正在尝试使用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']]
中的令牌之间不需要空格。如何设置间距?
答案 0 :(得分:0)
我不确定您是否真的想强制使用空格,'1 + 3'也不应该有效吗?
相反,通过添加asKeyword=True
关键字参数来修改Word表达式。
为谨慎起见,nestedExpr
是一个非常简单的解析器,如果还要解析嵌套表达式的内容,则应该使用递归解析器,或者可能使用infixNotation。进一步了解此答案:How do I implement this in ply, given how pyparsing works