Skip to content

Repository files navigation

TinyCompiler

基于算法链路实现的表驱动词法分析器:

  • 正则规则文件 -> Thompson 构造法(算法 2.2)生成 NFA
  • NFA -> 子集法(算法 2.5)生成 DFA
  • DFA -> 拓展驱动器(拓展算法 2.1)进行最长匹配扫描

规则文件格式

逐行声明:TOKEN_NAME:regex

示例见 examples/lexer-rules.txt

WS:[ \t\r\n]+
IDENT:[a-zA-Z_][a-zA-Z0-9_]*
NUMBER:[0-9]+(\.[0-9]+)?
OP:[=+\-*/]

说明:

  • 规则优先级按文件顺序,越靠前优先级越高。
  • 词法冲突决策:最长匹配优先;同长度再按规则顺序。
  • WS / WHITESPACE 默认跳过,不输出到 token stream。

命令

  • 安装依赖:yarn install
  • 类型检查:yarn typecheck
  • 运行测试:yarn test:run
  • 启动 watch 测试:yarn test
  • 词法扫描 CLI:yarn lex <regex-file> <expression>
  • 分步演示入口:yarn lex:trace <regex-file> <expression>

示例:

yarn lex examples/lexer-rules.txt "abc=x1+y2*10.0"

分步演示示例(会输出 NFA、DFA、最小化 DFA、token stream):

yarn lex:trace examples/lexer-rules.txt "time=c1+b1*20+66.98"

执行 lex:trace 后会自动生成 HTML 图示报告:

  • reports/trace-report.html
  • 页面包含 NFA / DFA / 最小化 DFA 的状态转换矩阵和最终 token stream

输出为 JSON token stream,结构如下:

[
  { "type": "identifier", "lexeme": "abc", "start": 0, "end": 3 },
  { "type": "operator", "lexeme": "=", "start": 3, "end": 4 }
]

常见错误

  • 规则格式非法:行中没有 :
  • 正则非法:括号/字符类不闭合、转义不完整
  • 词法错误:输入包含无法匹配任一规则的字符(会报行列号)

About

A Tiny TypeScript Compiler - for Homework

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages