3

我试图了解如何使用 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 = ???

很难积极地描述whatever_is_not_my_syntaxPEG.js 中的my_syntax内容,而不会!expression[^characters].

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

4

2 回答 2

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

于 2016-06-06T14:20:59.750 回答
1

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

而不是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

在此处输入图像描述

于 2021-10-31T18:25:59.203 回答