无需登录 数据私有 本地保存

PEG.js 语法在线测试器 - 解析表达式文法调试

12
0
0
0
PEG.js 语法测试器 加载中...
 点击 解析 按钮或按 Ctrl+Enter 查看结果
常见问题与知识点
什么是 PEG.js / 解析表达式文法?
PEG.js 是一个基于解析表达式文法(Parsing Expression Grammar)的解析器生成器。它允许你用简洁的语法规则描述语言结构,然后自动生成一个高效的 JavaScript 解析器。PEG 文法的特点是无歧义——选择运算符 / 采用优先级匹配,避免了传统 CFG 中的歧义问题。这使得 PEG 特别适合用于编写解析器、编译器、数据格式转换器等场景。
如何正确处理空白和空格?
PEG.js 不会自动跳过空白。你需要在语法中显式定义空白规则。通常的做法是定义一个 _ 规则来匹配空白字符:
_ "whitespace" = [ \t\n\r]*
然后在每条规则中合适的位置引用 _,例如:
Sum = head:Term _ "+" _ tail:Term
另一种方式是使用 __ 表示必须有至少一个空白字符的规则。
PEG.js 中如何返回自定义的解析结果?
在规则后面使用 JavaScript 代码块 { ... } 来转换解析结果。代码块中可以访问当前匹配的标签变量,以及辅助函数 text()(返回匹配的完整文本)、location()(返回位置信息)等。例如:
Integer = [0-9]+ { return parseInt(text(), 10); }
代码块中的 return 值将成为该规则的解析结果,向上传递给父规则。
为什么我的解析器报错 "Expected ... but ... found"?
这个错误表示解析器在某个位置期望匹配特定的字符或模式,但实际遇到了不同的内容。常见原因包括:① 忘记处理空白——PEG.js 不会自动跳过空格;② 规则顺序问题——选择运算符 / 按顺序尝试,如果前面的规则部分匹配成功但后续失败,不会回溯尝试后面的选项;③ 输入文本与语法定义不匹配——检查是否有未考虑的边缘情况。使用本工具的详细错误信息(含行列号)可以快速定位问题。
PEG.js 与正则表达式的区别是什么?
正则表达式适合处理线性、无嵌套的文本模式。而 PEG.js 可以处理递归嵌套结构(如括号匹配、HTML标签、编程语言语法树)。PEG 支持递归规则、带标签的部分匹配、语义动作(JavaScript代码块),能够构建完整的 AST(抽象语法树)。简言之:正则适合提取,PEG 适合解析。
如何在 Node.js 或项目中使用生成的解析器?
你可以使用 peg.generate(grammar, { output: 'source' }) 获取解析器的 JavaScript 源码,将其保存为 .js 文件。或者使用 peg.generate(grammar) 直接获取解析器对象。在项目中:
npm install pegjs
const peg = require('pegjs');
const parser = peg.generate(grammar);
const result = parser.parse(input);
PEG.js 支持哪些语法特性?
PEG.js 支持丰富的语法特性:字符类 [a-z]重复 * + ?序列 a b c选择 a / b正向/负向前瞻 &expr !expr标签捕获 label:rule语义动作 { code }规则引用(支持递归)、注释 ///* */。这些特性组合起来可以构建功能强大的解析器。
如何调试复杂的 PEG.js 语法?
调试技巧:① 使用本在线工具逐步测试语法片段;② 从简单规则开始,逐层构建复杂规则;③ 利用错误信息中的行列号定位问题位置;④ 在语义动作中使用 console.log()(浏览器控制台)输出中间结果;⑤ 使用 expectedfound 信息了解解析器的期望与实际输入;⑥ 尝试不同的输入验证边界情况。PEG.js 官方文档也提供了详细的调试建议。