【发布时间】:2016-02-29 09:37:20
【问题描述】:
我需要根据以下规则解析表达式:
- 表达式可以包含表示为
name:value的过滤器对象 - 表达式可以包含字符串表达式
- 表达式可以包含布尔值 OR,AND
- 里面的东西都可以引用
所以一个典型的表达式看起来像
filter1:45 hello world filter:5454
filter1:45 'hello world' filter:5454
hello world
'hello world' OR filter:43
这是我迄今为止尝试过的:
class BooleanLiteral(Keyword):
grammar = Enum(K("OR"), K("AND"))
class LineFilter(Namespace):
grammar = flag('inverted', "-"), name(), ":", attr('value', word)
class LineExpression(List):
grammar = csl(LineFilter, separator=blank)
有了这个语法,我可以解析像这样的字符串
filter2:32 filter1:3243
据我了解,我可以为csl 函数提供对象列表,并且语法需要按该顺序排列。但是,如果我想解析像
filter34:43 hello filter32:3232
或
filter34:43 OR filter32:3232
我怎么能说一个表达式中有多种类型的对象(过滤器、表达式、布尔值)?用 peg 可以吗?
【问题讨论】:
-
这绝对可以做到——只需要澄清几件事。过滤器、布尔值和文字的顺序完全不重要吗?即您可以按任何顺序拥有任意数量的它们吗?其次-当您说可以引用任何内容时-这是否意味着可以引用过滤器或布尔值以及字符串文字?是正常的分隔符空格(好像是这样)。如果空格是分隔符,带引号的字符串是否算作一个记号,还是几个记号?例如
hello world是两个令牌(hello和world),还是一个?对于"hello world",你如何回答同样的问题? -
您好,感谢您的评论,1) 唯一有意义的限制是布尔值不能相邻,但需要分隔
filter OR filter、expression OR expression或expression OR filter。否则有任意数量的过滤器和表达式,并且没有指定顺序。 2) 可以引用字符串文字和布尔值,而不是过滤器 3) 空格是正常的分隔符。 4) 带引号的字符串 = 一个标记。所以hello world是helloworld而"hello world"是hello world。我回答了你所有的问题吗? -
这一切都说得通,并回答了问题——我会尽量看看。
-
哦——我又想到了一件事——你在使用 PyPEG 2.15 吗?我想是的。
-
@JRichardSnape 是的,它的版本:2.15.0
标签: python regex parsing grammar peg