Pyparsing是否支持上下文敏感的语法?

Har*_*wEm 5 python parsing ply pyparsing

如果我的术语不正确,请原谅我; 或许只是用"正确"的词来形容我想要的东西足以让我自己找到答案.

我正在研究ODL(对象描述语言)的解析器,这是一种神秘的语言,据我所知现在只能由NASA PDS(行星数据系统使用;它是NASA如何向公众提供数据).幸运的是,PDS最终转向XML,但我仍然需要编写一个软件,用于在截止日期之前完成的任务.

ODL以如下方式定义对象:

OBJECT              = TABLE
  ROWS              = 128
  ROW_BYTES         = 512 
END_OBJECT          = TABLE
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个解析器pyparsing,我一直很好,直到我进入上面的构造.

我必须创建一些能够确保OBJECT行的右手值与END_OBJECT的RHV相同的规则.但我似乎无法将其纳入pyparsing规则.我可以确保两者都是语法上有效的值,但我不能采取额外的步骤并确保值相同.

  1. 我的直觉是正确的,这是一个上下文敏感的语法吗?这是我应该用来描述这个问题的短语吗?
  2. 无论这种语法在理论意义上是什么,都pyparsing能够处理这种结构吗?
  3. 如果pyparsing无法处理它,是否有另一个Python工具能够这样做?怎么样ply(lex/ 的Python实现yacc)?

ebo*_*man 6

它实际上是一种语境敏感语言的语法,经典地抽象为wcww在(a | b)*中的位置(注意wcw',其中'表示反转,是无上下文的).

解析表达式语法能够通过使用语义谓词来解析wcw类型的语言.PyParsing提供matchPreviousExpr()matchPreviousLiteral()为这个目的,如辅助方法

w = Word("ab")
s = w + "c" + matchPreviousExpr(w)
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下你可能会做类似的事情

table_name = Word(alphas, alphanums)
object = Literal("OBJECT") + "=" + table_name + ... +
  Literal("END_OBJECT") + "=" +matchPreviousExpr(table_name)
Run Code Online (Sandbox Code Playgroud)