【问题标题】:What is the role of the Empty production for PEGs?空产品对 PEG 的作用是什么?
【发布时间】:2011-05-04 06:18:12
【问题描述】:

空产生式规则

nonterminal -> epsilon

在 lex-yacc LR 自底向上解析器生成器(例如 PLY)中很有用。

在什么情况下应该在 PEG 解析器中使用 Empty 产生式,例如解析?

【问题讨论】:

    标签: python pyparsing ply peg


    【解决方案1】:

    BNF 经常使用空作为替代,有效地使整个表达式可选:

    leading_sign ::= + | - | empty
    integer ::= leading_sign digit...
    

    这在 pyparsing 中是不必要的,因为 pyparsing 包含用于此的 Optional 类:

    # no empty required
    leading_sign = Optional(oneOf("+ -"))
    integer = leading_sign + Word(nums)
    

    Empty 对于某些特定于 pyparsing 的目的确实派上用场:

    跳过空格 - pyparsing 中的某些元素在开始解析之前不会跳过空格,例如 CharsNotIn 和 restOfLine。如果您有一个简单的键值条目输入,其中键是带引号的字符串,值是带引号的字符串之后的所有内容,如下所示:

    "Key 1" value of Key 1
    "Key 2" value of Key 2
    

    定义为:

    quotedString + restOfLine
    

    会给你“键 1 的值”和“键 2 的值”作为值。 Pyparsing 的空 does 会跳过空格,因此将语法更改为:

    quotedString + empty + restOfLine
    

    将为您提供不带前导空格的值。

    在特定位置激活解析操作 - 我在 originalTextFor 中使用空作为生成表达式的一部分来插入开始和结束位置标记。 empty 的解析操作用它们的位置值替换它们,然后 originalTextFor 的解析操作使用这些位置从输入字符串中分割原始文本。

    小心使用空。空 always 匹配,但从不推进解析位置(跳过空格除外)。所以:

    OneOrMore(empty)
    

    将是一个无限循环。

    empty | "A" | "B" | "C"
    

    永远不会匹配任何非空的替代品,因为 MatchFirsts 短路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-07
      • 2021-08-09
      • 2021-08-19
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2014-04-25
      • 2021-10-30
      相关资源
      最近更新 更多