Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyparsing支持上下文敏感语法吗?_Python_Parsing_Pyparsing_Ply - Fatal编程技术网

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

Python Pyparsing支持上下文敏感语法吗?,python,parsing,pyparsing,ply,Python,Parsing,Pyparsing,Ply,如果我有不正确的术语,请原谅我;也许仅仅用“正确”的词语来描述我想要的就足以让我自己找到答案 我正在为ODL(Object Description Language,对象描述语言)开发一个解析器,据我所知,ODL是一种神秘的语言,目前仅由NASA PDS(行星数据系统)使用,这是NASA向公众提供数据的方式。幸运的是,PDS终于转向了XML,但我仍然需要为一项在中断前刚刚完成的任务编写软件 ODL以如下方式定义对象: OBJECT = TABLE ROWS

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

我正在为ODL(Object Description Language,对象描述语言)开发一个解析器,据我所知,ODL是一种神秘的语言,目前仅由NASA PDS(行星数据系统)使用,这是NASA向公众提供数据的方式。幸运的是,PDS终于转向了XML,但我仍然需要为一项在中断前刚刚完成的任务编写软件

ODL以如下方式定义对象:

OBJECT              = TABLE
  ROWS              = 128
  ROW_BYTES         = 512 
END_OBJECT          = TABLE
我正试图用
pyparsing
编写一个解析器,在完成上述构造之前,我一直做得很好

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

  • 我的直觉是否正确,这是一种上下文敏感语法?我应该用这个短语来描述这个问题吗
  • 无论这是哪种理论意义上的语法,
    pyparsing
    能够处理这种结构吗
  • 如果
    pyparsing
    无法处理它,是否有其他Python工具能够处理它?那么
    ply
    (lex/
    yacc
    的Python实现)呢

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

    在本例中,您希望编写上下文无关的语法规则:

      head = 'OBJECT' '=' IDENTIFIER ;
      tail = 'END_OBJECT'  '=' IDENTIFIER ;
      element = IDENTIFIER '=' value ;
      element_list = element ;
      element_list = element_list element ;
      block = head element_list tail ;
    
    头部和尾部构造是否具有匹配标识符的检查在技术上不是由解析器完成的

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

    如果在进行分析时构建一个表示解析的树,并在树上的不同位置挂起各种上下文敏感值(例如,将实际标识符值附加到head子句的树节点),那么这是最简单的。在为尾部构造构建树节点时,沿着树走,找到头树,然后比较标识符应该很简单

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


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

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

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

    w = Word("ab")
    s = w + "c" + matchPreviousExpr(w)
    
    所以在你的情况下,你可能会这样做

    table_name = Word(alphas, alphanums)
    object = Literal("OBJECT") + "=" + table_name + ... +
      Literal("END_OBJECT") + "=" +matchPreviousExpr(table_name)
    

    在pyparsing中,您可以将解析时间回调(我们称之为“解析操作”)附加到与
    对应的表达式上,它可以验证
    值是否一致,或者引发
    解析异常
    。所以你不必做很多“树上行走”,这就是我所讨论的语义动作。它自己造树吗?怎么用?如果没有,您如何检查终端的值呢?pyparsing将解析后的结构传递给回调,在本例中,回调将查看第一个和最后一个元素,以比较对象值字符串。所以我猜有一些树行走,但只在当前解析的对象上。通过添加一些标签(类似于正则表达式中的命名组),解析操作可以直接查看
    tokens.head.identifier
    tokens.tail.identifier
    ,以验证它们是否匹配。在我发布了这个问题后,我决定使用上述策略。我的直觉告诉我,由于对象从来都不是交错的,只是嵌套的,所以简单的语法可以正确地解析,我可以断言这些值是事后才想到的。但我不确定我能证明这一点。(我想,这会更有动力重返学校。)