| Crates.io | oak-jasmin |
| lib.rs | oak-jasmin |
| version | 0.0.1 |
| created_at | 2025-10-21 01:32:00.213851+00 |
| updated_at | 2026-01-23 04:29:56.835775+00 |
| description | Jasmin Java assembler parser with support for Java bytecode assembly and class file generation. |
| homepage | https://github.com/ygg-lang/oaks |
| repository | https://github.com/ygg-lang/oaks |
| max_upload_size | |
| id | 1893102 |
| size | 120,166 |
High-performance incremental JASMIN parser for the oak ecosystem with flexible configuration, optimized for JVM bytecode assembly and analysis.
Oak JASMIN is a robust parser for JASMIN, designed to handle complete Java assembler syntax including modern features. Built on the solid foundation of oak-core, it provides both high-level convenience and detailed AST generation for JVM bytecode processing and analysis.
Basic example:
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_jasmin::{JasminParser, JasminLanguage};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut session = ParseSession::<JasminLanguage>::default();
let parser = JasminParser::new();
let source = SourceText::new(r#"
.class public HelloWorld
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 2
.limit locals 1
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello, World!"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
"#);
let result = parser.parse(&[], &mut session);
println!("Parsed JASMIN successfully.");
Ok(())
}
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_jasmin::{JasminParser, JasminLanguage};
let mut session = ParseSession::<JasminLanguage>::default();
let parser = JasminParser::new();
let source = SourceText::new(r#"
.class public Calculator
.super java/lang/Object
.method public static add(II)I
.limit stack 2
.limit locals 2
iload_0
iload_1
iadd
ireturn
.end method
.method public static multiply(II)I
.limit stack 2
.limit locals 2
iload_0
iload_1
imul
ireturn
.end method
"#);
let result = parser.parse(&[], &mut session);
println!("Class parsed successfully.");
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_jasmin::{JasminParser, JasminLanguage};
let mut session = ParseSession::<JasminLanguage>::default();
let parser = JasminParser::new();
let source = SourceText::new(r#"
.method public factorial(I)I
.limit stack 2
.limit locals 2
iload_1
iconst_1
if_icmple Lbase
iload_1
iload_1
iconst_1
isub
aload_0
invokevirtual Calculator/factorial(I)I
imul
ireturn
Lbase:
iconst_1
ireturn
.end method
"#);
let result = parser.parse(&[], &mut session);
println!("Method parsed successfully.");
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_jasmin::{JasminParser, JasminLanguage};
let mut session = ParseSession::<JasminLanguage>::default();
let parser = JasminParser::new();
let source = SourceText::new("getstatic java/lang/System/out Ljava/io/PrintStream;");
let result = parser.parse(&[], &mut session);
println!("Token parsing completed.");
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_jasmin::{JasminParser, JasminLanguage};
let mut session = ParseSession::<JasminLanguage>::default();
let parser = JasminParser::new();
let source = SourceText::new(r#"
.class Broken
.method public bad_method()V
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello" -- Missing semicolon
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
.end class
"#);
let result = parser.parse(&[], &mut session);
if let Some(errors) = result.result.err() {
println!("Parse errors found: {:?}", errors);
} else {
println!("Parsed successfully.");
}
The parser generates a comprehensive AST with the following main structures:
Oak JASMIN integrates seamlessly with:
Check out the examples directory for comprehensive examples:
Contributions are welcome!
Please feel free to submit pull requests at the project repository or open issues.