在應用程序中嵌入Erg編譯器
在應用程序中嵌入Erg很容易
[dependencies]
erg = "0.5.12" # 選擇最新版本
use erg::DummyVM; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut vm = DummyVM::default(); let _res: String = vm.eval("print! \"Hello, world!\"")?; Ok(()) }
執行需要Python
還有一個不連接到運行時的獨立編譯器版本
[dependencies]
erg_compiler = "0.5.12" # 選擇最新版本
use erg_compiler::Compiler; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut compiler = Compiler::default(); let code = compiler.compile("print!\"Hello, world!\"", "exec")?; code.dump_as_pyc("o.pyc", None)?; Ok(()) }
Compiler
輸出一個名為CodeObj
的結構。這通常不是很有用,所以你可能想要使用Transpiler
,它輸出一個Python腳本
use erg_compiler::Transpiler; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut transpiler = Transpiler::default(); let script = transpiler.transpile("print!\"Hello, world!\"", "exec")?; println!("{}", script.code); Ok(()) }
其他示例還有輸出HIR(高級中間表示)的HIRBuilder
和輸出AST(抽象語法樹)的ASTBuilder
use erg_compiler::HIRBuilder; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut builder = HIRBuilder::default(); let artifact = builder.build("print!\"Hello, world!\"", "exec")?; println!("{}", artifact.hir); Ok(()) }
use erg_compiler::ASTBuilder; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut builder = ASTBuilder::default(); let ast = builder.build("print! \"Hello, world!\")")?; println!("{}", ast); Ok(()) }
執行語義分析的結構實現了一個名為ContextProvider
的trait。它可以獲取模塊中變量的信息,等等
use erg_compiler::Transpiler; use erg_compiler::context::ContextProvider; fn main() -> Result<(), Box<dyn std::error::Error>> { let mut transpiler = Transpiler::default(); let script = transpiler.transpile("i = 0", "exec")?; println!("{}", script.code); let typ = transpiler.get_var_info("i").0.t; println!("{typ}"); Ok(()) }