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 是基于寄存器的 這個轉換過程會多出幾層中間過程。