我试图了解如何在文本中使用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_syntax
来描述PEG.js中没有部分碰撞(和随后的解析器错误)的my_syntax
是什么,或者至少我不知道怎么做,因为PEG.js上唯一的负解析器函数是!expression
和[^characters]
。
答案 0 :(得分: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