Pyparsing支持上下文敏感语法吗?

2024-06-09 22:23:11 发布

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

如果我的术语不正确,请原谅我;也许只要用“正确”的词来描述我想要的东西就足以让我自己找到答案。在

我正在为ODL(对象描述语言)做解析器,据我所知,这是一种晦涩难懂的语言,目前只有NASA PDS(行星数据系统)使用;这是NASA向公众提供数据的方式。幸运的是,PDS最终转向了XML,但是我仍然需要为一个任务编写软件,而这个任务刚好在截止日期之前就失败了。在

ODL以如下方式定义对象:

OBJECT              = TABLE
  ROWS              = 128
  ROW_BYTES         = 512 
END_OBJECT          = TABLE

我正试图用pyparsing编写一个解析器,在我开始上面的构造之前,我一直做得很好。在

我必须创建一些规则来确保对象行的右侧值与END_OBJECT的RHV相同。但我似乎无法将其纳入pyparsing规则中。我可以确保这两个值在语法上都是有效的,但是我不能执行额外的步骤来确保值是相同的。在

  1. 我的直觉是否正确,这是一个上下文敏感的语法?这是我用来描述这个问题的短语吗?在
  2. 不管这是理论意义上的哪种语法,pyparsing能处理这种结构吗?在
  3. 如果pyparsing不能处理它,是否还有其他Python工具可以处理它?关于ply(即lex/yacc的Python实现)如何?在

Tags: 对象答案解析器object规则方式table语法
2条回答

它实际上是上下文相关语言的语法,经典地抽象为wcw,其中w在(a | b)*(注意,wcw',其中{}表示反转,是上下文无关的)。在

解析表达式语法能够通过使用语义谓词来解析wcw类型的语言。PyParsing为此提供了matchPreviousExpr()matchPreviousLiteral()助手方法,例如

w = Word("ab")
s = w + "c" + matchPreviousExpr(w)

所以在你的情况下,你可能会做一些

^{pr2}$

一般来说,解析器被构建为上下文无关的解析引擎。如果存在上下文敏感,则在解析后(或至少在相关解析步骤完成之后)将其嫁接。在

在您的例子中,您需要编写上下文无关的语法规则:

  head = 'OBJECT' '=' IDENTIFIER ;
  tail = 'END_OBJECT'  '=' IDENTIFIER ;
  element = IDENTIFIER '=' value ;
  element_list = element ;
  element_list = element_list element ;
  block = head element_list tail ;

从技术上讲,解析器不会检查head和tail构造是否具有匹配的标识符。在

然而,许多解析器允许在识别语法元素时发生语义操作,通常是为了构建树节点。在你的情况下,你想 使用它来启用附加检查。对于元素,您需要确保标识符不是块中已有内容的副本;这意味着对于遇到的每个元素,您需要捕获相应的标识符并生成一个特定于块的列表以启用重复检查。对于block,您需要捕获head*标识符*,并检查它是否与tail*标识符*匹配。在

如果您构建一个表示解析的树,并将各种上下文相关的值挂在树上的不同位置(例如,将实际的标识符值附加到head子句的树节点上),这是最简单的。在为tail构造构建树节点的时候,应该可以直接沿着树走,找到head树,然后比较标识符。在

如果您设想首先构建整个树,然后使用对树的后处理传递来进行此检查,则更容易考虑这一点。懒惰的人事实上是这样做的:-}我们所做的只是把在后处理步骤中可以完成的工作推到附加到语义动作的树构建步骤中。在

这些概念都不是python特有的,PyParsing的细节也会有所不同。在

相关问题 更多 >