1- use std:: {
2- env,
3- fs:: { self } ,
4- io:: Read ,
5- path:: Path ,
6- } ;
7- use zenlang:: { compiler, module, parser, strong_u64:: U64BitsControl , tokenizer, vm} ;
8- use zenlang_platform_std:: * ;
1+ use std:: { env, fs, io:: Read , path:: Path } ;
92
10- fn run_vm ( vm : & mut vm:: VM ) {
11- if let Err ( e) = vm. set_entry_function ( "main" ) {
12- println ! ( "vm error: {}" , e) ;
13- return ;
14- }
15- //println!("{:?}", vm.modules);
16-
17- vm. run_until_halt ( ) ;
18-
19- if !vm. error . is_empty ( ) {
20- let mut pc = vm. pc ;
21- pc. sub_low ( 1 ) ;
22-
23- println ! ( "\n -- begin runtime error --" ) ;
24- println ! ( "{}" , vm. error) ;
25- if let Some ( name) = vm. get_function_name_from_pc ( pc) {
26- println ! ( "runtime error in function {}" , name, ) ;
27- }
28- println ! ( "runtime error at pc = {}:{}" , pc. get_low( ) , pc. get_high( ) , ) ;
29- println ! ( "-- end runtime error --" ) ;
30- return ;
31- }
32-
33- println ! ( "returned {}" , vm. ret) ;
34-
35- if !vm. stack . is_empty ( ) {
36- println ! ( "{} values remained on stack!" , vm. stack. len( ) ) ;
37- } else {
38- println ! ( "no values leaked on stack" ) ;
39- }
40- }
41-
42- fn run_code ( code : String , module_name : String ) {
43- let mut tokenizer = tokenizer:: Tokenizer :: new ( code) ;
44- let mut parser = parser:: Parser :: new ( & mut tokenizer) ;
45- let mut compiler = compiler:: Compiler :: new ( & mut parser) ;
46-
47- if let Err ( e) = compiler. compile ( ) {
48- println ! ( "compile error: {}" , e) ;
49- return ;
50- }
51-
52- if compiler. warnings . len ( ) > 0 {
53- println ! ( "compile warnings:" ) ;
54- for warning in compiler. warnings . iter ( ) {
55- println ! ( "- {}" , warning) ;
56- }
57- }
58-
59- let module = compiler. get_module ( ) ;
60- module. name = module_name;
61-
62- let mut vm = vm:: VM :: new ( ) ;
63- vm. platform = Some ( Box :: new ( Platform :: new ( ) ) ) ;
64-
65- if let Err ( e) = vm. load_module ( & module) {
66- println ! ( "{}" , e) ;
67- return ;
68- }
69-
70- run_vm ( & mut vm) ;
71- }
72-
73- fn compile_code ( code : String , module_name : String , out_filename : String ) {
74- let mut tokenizer = tokenizer:: Tokenizer :: new ( code) ;
75- let mut parser = parser:: Parser :: new ( & mut tokenizer) ;
76- let mut compiler = compiler:: Compiler :: new ( & mut parser) ;
3+ use crate :: argparser:: ArgParser ;
774
78- if let Err ( e) = compiler. compile ( ) {
79- println ! ( "compile error: {}" , e) ;
80- return ;
81- }
82-
83- if compiler. warnings . len ( ) > 0 {
84- println ! ( "compile warnings:" ) ;
85- for warning in compiler. warnings . iter ( ) {
86- println ! ( "- {}" , warning) ;
87- }
88- }
89-
90- let module = compiler. get_module ( ) ;
91- module. name = module_name;
92- match module. compile ( ) {
93- Err ( e) => {
94- println ! ( "module compile error: {}" , e) ;
95- }
96- Ok ( bytes) => {
97- let _ = fs:: write ( out_filename, bytes) ;
98- }
99- }
100- }
5+ mod argparser;
6+ mod runner;
1017
102- fn run_bytes ( bytes : Vec < u8 > ) {
103- let mut module = module:: Module :: new ( ) ;
104- if let Err ( e) = module. load ( bytes) {
105- println ! ( "load error: {}" , e) ;
106- return ;
107- }
108-
109- let mut vm = vm:: VM :: new ( ) ;
110- vm. platform = Some ( Box :: new ( Platform :: new ( ) ) ) ;
111-
112- if let Err ( e) = vm. load_module ( & module) {
113- println ! ( "{}" , e) ;
114- return ;
115- }
116-
117- run_vm ( & mut vm) ;
118- }
119-
120- fn get_module_name_from_path ( path : String ) -> String {
8+ pub fn get_module_name_from_path ( path : & String ) -> String {
1219 let path = Path :: new ( & path) ;
12210
12311 if let Some ( stem) = path. file_stem ( ) {
@@ -128,35 +16,28 @@ fn get_module_name_from_path(path: String) -> String {
12816}
12917
13018fn main ( ) {
131- let mut args: Vec < String > = env :: args ( ) . collect ( ) ;
132- args. push ( "/home/aceinet/ZenLang/a.zen" . into ( ) ) ;
19+ let mut args = ArgParser :: new ( ) ;
20+ args. parse ( & env :: args ( ) . collect :: < Vec < String > > ( ) ) ;
13321
134- if args. len ( ) < 2 {
22+ if args. filename . is_empty ( ) {
13523 println ! ( "zenlang: no filename provided" ) ;
13624 return ;
13725 }
13826
139- let mut compile: bool = false ;
140- if args. len ( ) >= 3 {
141- if args[ 2 ] == "compile" {
142- compile = true ;
143- }
144- }
145-
146- let module_name = get_module_name_from_path ( args[ 1 ] . clone ( ) ) ;
147- match fs:: File :: open ( & args[ 1 ] ) {
27+ let module_name = get_module_name_from_path ( & args. filename ) ;
28+ match fs:: File :: open ( & args. filename ) {
14829 Ok ( mut file) => {
149- if !compile {
150- if args[ 1 ] . ends_with ( ".zen" ) {
30+ if !args . compile {
31+ if args. filename . ends_with ( ".zen" ) {
15132 let mut text = String :: new ( ) ;
15233 if let Err ( error) = file. read_to_string ( & mut text) {
15334 println ! ( "read error: {}" , error) ;
15435 return ;
15536 }
156- run_code ( text, module_name) ;
157- } else if args[ 1 ] . ends_with ( ".zenc" ) {
37+ runner :: run_code ( text, module_name) ;
38+ } else if args. filename . ends_with ( ".zenc" ) {
15839 let bytes: Vec < u8 > ;
159- match fs:: read ( & args[ 1 ] ) {
40+ match fs:: read ( args. filename ) {
16041 Err ( e) => {
16142 println ! ( "read error: {}" , e) ;
16243 return ;
@@ -165,7 +46,7 @@ fn main() {
16546 bytes = data;
16647 }
16748 }
168- run_bytes ( bytes) ;
49+ runner :: run_bytes ( bytes) ;
16950 }
17051 } else {
17152 let mut text = String :: new ( ) ;
@@ -174,11 +55,11 @@ fn main() {
17455 return ;
17556 }
17657 let filename = format ! ( "{}.zenc" , module_name) ;
177- compile_code ( text, module_name, filename) ;
58+ runner :: compile_code ( text, module_name, filename) ;
17859 }
17960 }
18061 Err ( e) => {
181- println ! ( "failed to open {}: {}" , & args[ 1 ] , e) ;
62+ println ! ( "failed to open {}: {}" , args. filename , e) ;
18263 }
18364 }
18465}
0 commit comments