pypeg2这个表达式可以用peg语法解析吗?

2024-09-27 22:42:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要根据以下规则解析表达式:

  1. 表达式可以包含表示为name:value的筛选器对象
  2. 表达式可以包含字符串表达式
  3. 表达式可以包含布尔值或和
  4. 里面的一切都可以引用

所以一个典型的表达式看起来像

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

我怎么能说在一个表达式中有多种类型的对象(过滤器、表达式、布尔值)?佩格有可能吗?在


Tags: or对象namehelloworldvalue表达式语法
1条回答
网友
1楼 · 发布于 2024-09-27 22:42:33

从问题和注释中的规范来看,我认为您的代码很接近-但您不希望csl。我把你想要的代码放在下面(它可能不是最优雅的实现,但我认为它是合理的)。您必须避免BooleanLiteralStringLiteral的子集的潜在问题。这意味着你不能让LineExpression拥有

grammar = maybe_some([LineFilter,StringLiteral]), optional(BooleanLiteral)

我想,结果是根据你的规范,列出了一个类型正确的对象。我认为要强调的关键一点是,您可以使用python list(即[LineFilter,StringLiteral]表示LineFilterStringLiteral)。PEG解析器将按照它们出现的顺序来尝试它们,也就是说,它将尝试匹配第一个,只有在失败时才会尝试第二个,依此类推。在

^{pr2}$

输出

Input:
filter34:43 "My oh my!!" Hello OR filter32:3232 "AND" "Goodbye cruel world"
Parsed output:
==============
LineFilter([], name=Symbol('filter34')) <class '__main__.LineFilter'>
"My oh my!!" <class '__main__.StringLiteral'>
Hello <class '__main__.StringLiteral'>
OR <class '__main__.BooleanLiteral'>
LineFilter([], name=Symbol('filter32')) <class '__main__.LineFilter'>
"AND" <class '__main__.BooleanLiteral'>
"Goodbye cruel world" <class '__main__.StringLiteral'>

相关问题 更多 >

    热门问题