Ergコンパイラのアプリケーションへの組み込み
貴方のアプリケーションへErgを組み込むことは簡単です。
[dependencies]
erg = "0.5.12" # choose latest version
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" # choose latest version
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
という構造体を出力します。これは一般的にはあまり役に立たないので、Pythonのスクリプトを出力するTranspiler
を使うのも良いでしょう。
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
というトレイトを実装しています。モジュール内の変数情報を得ることなどができます。
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(()) }