【问题标题】:Using PEG.js for simple search/replace使用 PEG.js 进行简单的搜索/替换
【发布时间】:2016-04-22 06:24:11
【问题描述】:

我试图了解如何使用 PEG.js 在文本中进行简单的搜索/替换。当然这不是解析器的预期用途,但无论如何我很好奇这些语言背后的逻辑以产生一些搜索/替换。

我遇到的问题是很难正面定义某些定义的互补性。一个例子:假设我想搜索和替换类似这样的语法:

rule = (whatever_is_not_my_syntax* m:my_syntax)+ {replace m}
word = [a-z0-9_]+
my_syntax = word "." word
whatever_is_not_my_syntax = ???

很难肯定地描述 PEG.js 中的 whatever_is_not_my_syntax 是什么,而不会与 my_syntax 发生部分冲突(以及随之而来的解析器错误),或者至少我不知道该怎么做,因为唯一的否定解析器PEG.js 上的函数是 !expression[^characters]

你能帮帮我吗?如果有任何关于这个主题的书籍或参考书目,我将不胜感激。提前谢谢你。

【问题讨论】:

    标签: peg pegjs


    【解决方案1】:

    您不必指定语法中没有的内容。首先尝试匹配您的语法,然后为其他任何内容使用后备。

    这里的rule 是您的语法中所有模式的列表。当不匹配时,other 将改为匹配。

    expr =
        a:rule " " b:expr
            {return [a].concat(b)}
      / a:rule
            {return [a]}
      / a:other " " b:expr
            {return [a].concat(b)}
      / a:other
            {return [a]}
    
    word =
        a:[a-z0-9_]+
            {return a.join("")}
    
    rule =
        word "." word
            {return "rule1"} // Put replace logic here
      / word ":" word
            {return "rule2"} // Put replace logic here
    
    other =
        word
            {return "other"}
    

    您可以在线试用:http://pegjs.org/online

    【讨论】:

      【解决方案2】:

      你很亲密,我们唯一的区别是顺序:

      而不是whatever_is_not_my_syntax* m:my_syntax 应该是m:my_syntax whatever_is_not_my_syntax。请注意,在这种情况下使用会产生错误:

      Line 1, column 15: Possible infinite loop when parsing (repetition used with an expression that may not consume any input).
      

      因此,不用whatever_is_not_my_syntax* 只需whatever_is_not_my_syntax 就足够了。

      root = result:(rules / whatever_is_not_my_syntax)* { return result.join(""); }
      
      rules = 
        my_syntax /
        else_syntax
      
      else_syntax = word ":" word { return "replace2" }
      
      my_syntax = word "." word { return "replace1" }
      
      word = [a-z0-9_]+
      
      whatever_is_not_my_syntax = .
      

      输入:

      a x:y b x.y c
      

      将转化为:

      "a replace2 b replace1 c"
      

      您可以在线试用:http://pegjs.org/online

      【讨论】:

        猜你喜欢
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2011-04-07
        相关资源
        最近更新 更多