Compare commits
2 commits
b3bdc41a3e
...
0edbc46aa0
Author | SHA1 | Date | |
---|---|---|---|
Logan Gatlin | 0edbc46aa0 | ||
Logan Gatlin | bff36013fb |
11
demo.lang
11
demo.lang
|
@ -1,9 +1,6 @@
|
||||||
i := 0x0;
|
i := 0;
|
||||||
|
|
||||||
if i > 10 {
|
while i < 10 {
|
||||||
print "a";
|
i = i + 1;
|
||||||
} else if i > 5 {
|
print;
|
||||||
print "b";
|
|
||||||
} else {
|
|
||||||
print "c";
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,10 +62,7 @@ fn test_expression(expr: &str) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
/*
|
|
||||||
let module = frontend::Module::from_file("./demo.lang")?;
|
let module = frontend::Module::from_file("./demo.lang")?;
|
||||||
module.execute();
|
module.execute();
|
||||||
*/
|
|
||||||
test_expression("(a: b) -> c {}");
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
65
src/types.rs
65
src/types.rs
|
@ -1,3 +1,5 @@
|
||||||
|
use crate::Expression;
|
||||||
|
|
||||||
use super::err::*;
|
use super::err::*;
|
||||||
|
|
||||||
macro_rules! primitives {
|
macro_rules! primitives {
|
||||||
|
@ -46,15 +48,12 @@ impl Primitive {
|
||||||
match (a, b) {
|
match (a, b) {
|
||||||
// Whole? coerces to any whole or integer
|
// Whole? coerces to any whole or integer
|
||||||
(whole_ambiguous, w @ (w8 | w16 | w32 | w64 | i8 | i16 | i32 | i64))
|
(whole_ambiguous, w @ (w8 | w16 | w32 | w64 | i8 | i16 | i32 | i64))
|
||||||
| (w @ (w8 | w16 | w32 | w64 | i8 | i16 | i32 | i64), whole_ambiguous) => {
|
| (w @ (w8 | w16 | w32 | w64 | i8 | i16 | i32 | i64), whole_ambiguous) => Ok(w),
|
||||||
w
|
|
||||||
},
|
|
||||||
// Integer? coerces to any integer
|
// Integer? coerces to any integer
|
||||||
(integer_ambiguous, i @ (i8 | i16 | i32 | i64))
|
(integer_ambiguous, i @ (i8 | i16 | i32 | i64))
|
||||||
| (i @ (i8 | i16 | i32 | i64), integer_ambiguous) => i,
|
| (i @ (i8 | i16 | i32 | i64), integer_ambiguous) => Ok(i),
|
||||||
_ => whole_ambiguous,
|
_ => error(),
|
||||||
};
|
}
|
||||||
todo!()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +85,52 @@ macro_rules! all_selfsame {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
all_selfsame!(
|
all_selfsame!(w8, w16, w32, w64, whole, i8, i16, i32, i64, integer, r32, r64, real, string);
|
||||||
w8, w16, w32, w64, whole, i8, i16, i32, i64, integer, r32, r64, real, string
|
|
||||||
);
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum Type {
|
||||||
|
Ambiguous,
|
||||||
|
Empty,
|
||||||
|
Primitive(Primitive),
|
||||||
|
Struct(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum Symbol {
|
||||||
|
Mutable {
|
||||||
|
name: String,
|
||||||
|
value: Option<Expression>,
|
||||||
|
type_: Type,
|
||||||
|
},
|
||||||
|
Immutable {
|
||||||
|
name: String,
|
||||||
|
value: Expression,
|
||||||
|
type_: Type,
|
||||||
|
},
|
||||||
|
Struct {
|
||||||
|
name: String,
|
||||||
|
},
|
||||||
|
BlockStart,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct SymbolTable {
|
||||||
|
stack: Vec<Symbol>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SymbolTable {
|
||||||
|
pub fn define(&mut self, sym: Symbol) {
|
||||||
|
self.stack.push(sym);
|
||||||
|
}
|
||||||
|
pub fn start_block(&mut self) {
|
||||||
|
self.stack.push(Symbol::BlockStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn end_block(&mut self) {
|
||||||
|
while !self.stack.is_empty() {
|
||||||
|
if let Some(Symbol::BlockStart) = self.stack.pop() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue