我需要根据以下规则解析表达式:
name:value
的筛选器对象所以一个典型的表达式看起来像
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
我怎么能说在一个表达式中有多种类型的对象(过滤器、表达式、布尔值)?佩格有可能吗?在
从问题和注释中的规范来看,我认为您的代码很接近-但您不希望
csl
。我把你想要的代码放在下面(它可能不是最优雅的实现,但我认为它是合理的)。您必须避免BooleanLiteral
是StringLiteral
的子集的潜在问题。这意味着你不能让LineExpression
拥有我想,结果是根据你的规范,列出了一个类型正确的对象。我认为要强调的关键一点是,您可以使用python
^{pr2}$list
(即[LineFilter,StringLiteral]
表示LineFilter
或StringLiteral
)。PEG解析器将按照它们出现的顺序来尝试它们,也就是说,它将尝试匹配第一个,只有在失败时才会尝试第二个,依此类推。在输出
相关问题 更多 >
编程相关推荐