我正在尝试编写一个琶音语法,该语法将提取可以用逗号或空格分隔的标记。也就是说,令牌可以用逗号分隔,如下所示:
a,b,c
空格,如下所示:
a b c
或类似的组合:
a, b c
以上所有内容都会产生三个标记
"a"
,"b"
和"c"
。我还希望允许使用空令牌,以便两个逗号之间只有空格而不会产生空令牌:"a,b,, c" -> ["a", "b", "", "c"]
我已经定义了琶音语法,如下所示:
def token(): return RegExMatch('[^\s,]*')
def sep(): return RegExMatch('\s*[\s,]\s*')
def token_list(): return token, ZeroOrMore(sep, token)
def tokens(): return OneOrMore(token_list), EOF
parser = ParserPython(tokens)
并实现了一个非常简单的访问者,如下所示:
class TokenVisitor(PTNodeVisitor):
def visit_token_list(self, node, children):
return list(take_nth(2, children))
和这样的顶层函数:
def tokenize(string):
tree = parser.parse(string)
return visit_parse_tree(tree, TokenVisitor())
在这些示例上,一切都很好:
tokenize('a,b,c') # [u'a', u'b', u'c']
tokenize('a, b ,c') # [u'a', u'b', u'c']
但是,以下示例给了我奇怪的输出:
tokenize('a,b c') # u'a | , | b | c | '
tokenize('a,b c') # u'a | b | c | '
tokenize('a,b,,c') # [u'a', u'b', u',']
关于琶音如何处理空白和我不理解的空字符串,可能有些事情。如何修正语法以正确解析所有这些示例?
最佳答案
默认情况下,琶音解析器会跳过空白。要覆盖此行为,请将skipws=False
传递给ParserPython
构造函数:
parser = ParserPython(tokens, skipws=False)
请参见http://www.igordejanovic.net/Arpeggio/configuration/#white-space-handling。
关于python - 使用琶音处理空格或逗号分隔的标记列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43617650/