首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PEG.js进行简单的搜索/替换

使用PEG.js进行简单的搜索/替换
EN

Stack Overflow用户
提问于 2016-01-17 04:22:45
回答 2查看 282关注 0票数 3

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

我遇到的问题是,很难肯定地定义一些定义的互补性。例如:假设我想要搜索并替换类似以下语法的内容:

代码语言:javascript
复制
rule = (whatever_is_not_my_syntax* m:my_syntax)+ {replace m}
word = [a-z0-9_]+
my_syntax = word "." word
whatever_is_not_my_syntax = ???

在不与my_syntax发生部分冲突(以及由此导致的解析器错误)的情况下,很难肯定地描述PEG.js中的whatever_is_not_my_syntax是什么,或者至少我不知道如何做到这一点,因为PEG.js上唯一的负面解析器函数是!expression[^characters]

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

EN

回答 2

Stack Overflow用户

发布于 2016-06-06 22:21:00

您不必指定语法中没有的内容。首先试着匹配你的语法,然后有一个后备的任何其他东西。

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

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2021-10-31 18:25:59

你很接近,我们唯一最大的不同是顺序:

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

代码语言:javascript
复制
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*

代码语言:javascript
复制
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 = .

输入:

代码语言:javascript
复制
a x:y b x.y c

将转换为:

代码语言:javascript
复制
"a replace2 b replace1 c"

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34831734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档