首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用arpeggio处理以空格或逗号分隔的标记列表

使用arpeggio处理以空格或逗号分隔的标记列表
EN

Stack Overflow用户
提问于 2017-04-26 01:48:02
回答 1查看 283关注 0票数 1

我正在尝试编写一个arpeggio语法,它将提取可以由逗号或空格分隔的标记。也就是说,可以用逗号分隔标记,如下所示:

代码语言:javascript
复制
a,b,c

空白,如下所示:

代码语言:javascript
复制
a b  c

或者一个组合,就像这样:

代码语言:javascript
复制
a, b c

以上所有内容都将生成三个标记"a""b""c"。我还希望允许使用空令牌,这样两个逗号之间只有空格就会产生一个空令牌:

代码语言:javascript
复制
"a,b,, c" -> ["a", "b", "", "c"]

我已经这样定义了我的音高语法:

代码语言:javascript
复制
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)

并实现了一个非常简单的访问器,如下所示:

代码语言:javascript
复制
class TokenVisitor(PTNodeVisitor):
    def visit_token_list(self, node, children):
        return list(take_nth(2, children))

和一个像这样的顶级函数:

代码语言:javascript
复制
def tokenize(string):
    tree = parser.parse(string)
    return visit_parse_tree(tree, TokenVisitor())

在这些示例中,这一切都工作得很好:

代码语言:javascript
复制
tokenize('a,b,c') # [u'a', u'b', u'c']
tokenize('a, b ,c') # [u'a', u'b', u'c']

然而,下面的示例给出了奇怪的输出:

代码语言:javascript
复制
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',']

我可能不明白arpeggio是如何处理空格和空字符串的。我如何修正我的语法来正确地解析所有这些例子呢?

EN

回答 1

Stack Overflow用户

发布于 2017-04-26 04:56:58

默认情况下,Arpeggio的解析器会跳过空格。要覆盖此行为,请将skipws=False传递给ParserPython构造函数:

代码语言:javascript
复制
parser = ParserPython(tokens, skipws=False)

参见http://www.igordejanovic.net/Arpeggio/configuration/#white-space-handling

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43617650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档