load example program from file

This commit is contained in:
Michael Sippel 2024-05-16 00:47:37 +02:00
parent 9ad58620d6
commit f8a967abbf
Signed by: senvas
GPG key ID: F96CF119C34B64A6
3 changed files with 208 additions and 95 deletions

View file

@ -20,13 +20,13 @@ use crate::{
fn compile(
scope: &Arc<RwLock<Scope>>,
name: &str,
source: &str,
source: impl Iterator<Item = char>,
) -> Vec<tisc::assembler::AssemblyWord> {
ProcedureCompiler::new(scope)
.compile(
&parser::parse_expr(
&scope.read().unwrap().typectx,
&mut lexer::LTIRLexer::from(source.chars().peekable())
&mut lexer::LTIRLexer::from(source.peekable())
.filter(|tok| match tok {
(_, Ok(lexer::LTIRToken::Comment(_))) => false,
_ => true
@ -40,10 +40,10 @@ fn compile(
/* TODO:
* - write to address resulting from expression
* - `::` -> '.' and allow only
* - Parser error reporting
* - Compiler error reporting
* - write to address resulting from expression
* - sized objects
* - Typecheck for LTExpr::Application
* - typecheck & inference for rest
*/
@ -57,100 +57,16 @@ fn main() {
let main_scope = Scope::with_parent(&root_scope);
let typectx = main_scope.read().unwrap().typectx.clone();
let args: Vec<String> = std::env::args().collect();
let path = &args[1];
let iter_chars = iterate_text::file::characters::IterateFileCharacters::new(path);
/* link assembly-program to symbols
*/
linker.add_procedure(
"main",
compile(
&main_scope,
"main",
"{
let print-nullterm =
λ{} : < Seq Char ~Ascii ~ machine.Word >
~ < NullTerminatedArray machine.Word >
{
while(dup) { emit; }
drop;
};
print-nullterm 'H' 'a' 'l' 'l' 'o' ' ' 'W' 'e' 'l' 't' '!' '\n' '\0';
let fmt-uint =
λx : ~ _2^64 ~ machine.UInt64
{
if( x ) {
while( x ) {
i+ '0' (i% x 10);
! x (i/ x 10);
}
} else {
'0';
};
};
let print-uint = λx: print-nullterm (fmt-uint x) '\0';
let int-neg = λx : ~ machine.Int64 ~ machine.Word i+ (bit-neg x) 1;
let int-sign = λx : ~ machine.Int64 ~ machine.Word bit-and (bit-shr x 63) 1;
let int-lt = λ{
a : ~ machine.Int64;
b : ~ machine.Int64;
} int-sign (i- a b);
let int-gt = λ{
a : ~ machine.Int64;
b : ~ machine.Int64;
} int-sign (i- b a);
let int-eq = λ{
a : ~ machine.Int64;
b : ~ machine.Int64;
} if (i- a b) { 0; } else { 1; };
let int-lte = λa: λb: bit-or (int-lt a b) (int-eq a b);
let int-gte = λa: λb: bit-or (int-gt a b) (int-eq a b);
let int-min = λ{
a : ~ machine.Int64;
b : ~ machine.Int64;
} if( int-lt a b ) { a; } else { b; };
let int-max = λ{
a : ~ machine.Int64;
b : ~ machine.Int64;
} if( int-gt a b ) { a; } else { b; };
let vec3i-add = λ{
{ ax:_2^64; ay:_2^64; az:_2^64; } : <Vec3 _2^64~machine.UInt64>;
{ bx:_2^64; by:_2^64; bz:_2^64; } : <Vec3 _2^64~machine.UInt64>;
} {
i+ az bz;
i+ ay by;
i+ ax bx;
};
let fmt-vec3i =
λ{ x:_2^64; y:_2^64; z:_2^64; } : <Vec3 _2^64~machine.UInt64>
{
'}';
fmt-uint z; '='; 'z'; ' '; ';';
fmt-uint y; '='; 'y'; ' '; ';';
fmt-uint x; '='; 'x'; '{';
};
let red-u8rgb
: <Fn <> Color ~ RGB ~ <Vec3 _0,1 ~ _256 ~ machine.UInt64>>
= λ{} { 0; 0; 255; };
let green-u8rgb = λ{} { 0; 255; 0; };
let blue-u8rgb = λ{} { 255; 0; 0; };
let yellow-u8rgb = λ{} { 0; 220; 220; };
print-nullterm (fmt-vec3i (vec3i-add green-u8rgb blue-u8rgb)) '\n' '\0';
}"
),
);
linker.add_procedure("main", compile(&main_scope, "main", iter_chars));
/* load & run compiled bytecode
*/
let main_addr = linker
.get_link_addr(&"main".into())
.expect("'main' not linked");