mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-28 12:14:43 +00:00
2.7 KiB
2.7 KiB
ergc
的架构
1. 扫描 Erg 脚本 (.er) 并生成 TokenStream
(parser/lex.rs)
- parser/lexer/Lexer 生成
TokenStream
(这是一个Token的迭代器,TokenStream可以通过lexer.collect()生成)Lexer
由Lexer::new
或Lexer::from_str
构造,其中Lexer::new
从文件或命令选项中读取代码Lexer
可以作为迭代器按顺序生成令牌;如果您想一次获得TokenStream
,请使用Lexer::lex
Lexer
输出LexError
为错误,但LexError
没有足够的信息显示自己。如果要显示错误,请使用LexerRunner
转换错误- 如果你想单独使用
Lexer
,也可以使用LexerRunner
;Lexer
只是一个迭代器,并没有实现Runnable
特性Runnable
由LexerRunner
、ParserRunner
、Compiler
和VirtualMachine
实现
2. 转换 TokenStream
-> AST
(parser/parse.rs)
Parser
和Lexer
一样,有两个构造函数,Parser::new
和Parser::from_str
,而Parser::parse
会给出AST
AST
是Vec<Expr>
的包装器类型
2.5 脱糖 AST
- 扩展嵌套变量 (
Desugarer::desugar_nest_vars_pattern
) - desugar 多模式定义语法(
Desugarer::desugar_multiple_pattern_def
)
3. 类型检查和推断,转换 AST
-> HIR
(compiler/lower.rs)
HIR
有每个变量的类型信息。它是用于"高级中间表示"的HIR
只保存变量的类型,但这已经足够了。在极端情况下,这是因为 Erg 只有转换(或运算符)应用程序的参数对象ASTLower
可以用与Parser
和Lexer
相同的方式构造- 如果没有错误发生,
ASTLowerer::lower
将输出HIR
和CompileWarnings
的元组 ASTLowerer
归Compiler
所有。与传统结构不同,ASTLowerer
处理代码上下文并且不是一次性的- 如果类型推断的结果不完整(如果存在未知类型变量),名称解析时会出错
4. 检查副作用(compiler/effectcheck.rs)
4. 检查所有权(compiler/memcheck.rs)
5. 从HIR
(compiler/codegen.rs)生成字节码(CodeObj
)
- 根据表达式的类型信息,将执行量化子程序的名称解析
(6.(未来计划)转换字节码 -> LLVM IR)
- 字节码是基于堆栈的,而 LLVM IR 是基于寄存器的 这个转换过程会多出几层中间过程。