@noldova/context.parsers

中文文档
0.0.4发布于 2026/11/02MITTypeScriptES Module构建来源已验证

CONTEXT语言解析器的共享基础:一个具有跨度和行位置的不可变源,它上面的一个读取器,以及每个语言解析器所基于的词法分析器和解析器基类。它没有语法;TypeScript, Regex和未来的语言

中文使用文档
文档目录6 节
  1. 安装
  2. 模型
  3. 诊断
  4. 信任边界
  5. 使用
  6. 许可证

noldova.context.parsers

上下文语言解析器的共享基础:具有的不可变源 跨度和行位置,上面的读取器,词法分析器和解析器基 类,每种语言解析器都建立在这些类之上。它没有语法;打印稿, Regex和未来的语言是单独的包。

安装

npm install @noldova/context.parsers

模型

  • Source 保存文本一次。 SourceSpan 是一个半开放的UTF-16范围; SourceLineMap 将偏移量映射到行和回。
  • SourceReader 源或源的有界区域上的游标。最后 它返回空字符和代码点0,因此词法分析器比较字符 而不是检查结束;在哪里空字符是合法的 输入, isAtEnd 决定。
  • Node 是每个语法节点的基础:一个跨度和可选的琐事。一个 语言通过自己的声明合并向节点添加行为 包;语法代码识别节点类型 instanceof.
  • Lexer 拥有它的阅读器,报告到解析器上下文的诊断 收集器,每次调用产生一个节点。它检查两个不变量 每一种语言:lex要么推进,要么产生 EndOfFileNode 正好在最后,重复词法也遵循同样的规则。
  • Parser 保存一个当前节点。它按节点类型推进、消耗、查找 向前,并尝试解释与精确倒带,并重新释放电流 节点时,语法位置改变了标记的含义,例如 >> 在类型参数或 / 正则表达式的开头。
  • ParserContext 携带语法状态并拥有已发布的内容 DiagnosticCollector. 一种语言为它的标志和符号派生出它自己的上下文 缓存。

诊断

解析器上下文拥有的一个序列接收 报告的顺序:词法分析器的顺序是每个节点的顺序,语法的顺序是每个节点的顺序 解析。这是语法决策可以参考的序列。倒带恢复 当前节点,读取器偏移量,和序列长度,什么都没有 从中间移开。re-lex也不会移除任何东西;更换 扫描报告已经存在的东西,一种语言的扫描可以 在同一位置重复诊断应用其自身的抑制规则,如 TypeScript使用tsc的相同偏移量规则。

信任边界

将位置交还给读者,通过 seek, advance,相对的窥视; 或者跨度的创造,来自于读者本身,不需要再次验证; 这使每个令牌路径免于检查。所有接受偏移量的东西 或者从其他地方的span验证它: Source, SourceReader 构造函数, SourceLineMap, SourceLine, SourcePosition.

使用

语言解析器从这些类派生其节点、词法分析器和解析器:

import { DiagnosticCollector, EndOfFileNode, Lexer, LiteralNode, Node, Parser, ParserContext, Source, SourceSpan } from "@noldova/context.parsers";

class TextLiteralNode extends LiteralNode {
  public constructor(value: string, span: SourceSpan) {
    super(value, span);
  }
}

class TextLexer extends Lexer {
  public constructor(source: Source, diagnosticCollector: DiagnosticCollector) {
    super(source, diagnosticCollector);
  }

  protected override lexNode(): Node {
    const startOffset = this.reader.currentOffset;
    if (this.reader.isAtEnd)
      return new EndOfFileNode(new SourceSpan(startOffset, 0));

    const text = this.reader.readWhile(() => true).toString();
    return new TextLiteralNode(text, new SourceSpan(startOffset, text.length));
  }
}

class TextParser extends Parser<LiteralNode> {
  public constructor(context: ParserContext, lexer: TextLexer) {
    super(context, lexer);
  }

  protected override parseRootNode(): LiteralNode {
    const root = this.requireCurrentNode(LiteralNode);
    this.advance();
    return root;
  }
}

const source = new Source("text");
const context = new ParserContext(source);
const result = new TextParser(context, new TextLexer(source, context.diagnosticCollector)).parse();
console.assert(result.rootNode.value === "text" && result.diagnostics.length === 0);

例子的 console 需要Node的类型: @types/node, "types": ["node"] 在 tsconfig.json. 声明文件 api/index.d.ts 记录每个成员的合同和示例。

许可证

麻省理工学院;看到 LICENSE.

版本与发布记录

@noldova/context.parsers 共发布 5 个版本,首次发布于 2026/10/31;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.0.4latest2026/11/021 天前
0.0.32026/10/313 天前
0.0.22026/10/313 天前
0.0.12026/10/313 天前
0.0.0-stage2026/10/313 天前

关于 @noldova/context.parsers 的常见问题

@noldova/context.parsers 是什么?

CONTEXT语言解析器的共享基础:一个具有跨度和行位置的不可变源,它上面的一个读取器,以及每个语言解析器所基于的词法分析器和解析器基类。它没有语法;TypeScript, Regex和未来的语言

如何安装 @noldova/context.parsers?

在项目目录运行 npm install @noldova/context.parsers,或使用 pnpm add / yarn add / bun add。

@noldova/context.parsers 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@noldova/context.parsers 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@noldova/context.parsers 可以商用吗?

@noldova/context.parsers 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@noldova/context.parsers 还在维护吗?

最新版本 0.0.4 发布于 2026/11/02(1 天前);至今共发布 5 个版本,其中过去 12 个月发布了 5 个;首次发布于 2026/10/31。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。