Skip to content
Snippets Groups Projects
Commit b8afed80 authored by Per Lindgren's avatar Per Lindgren
Browse files

fallible wip1

parent 93c15c7c
No related branches found
No related tags found
No related merge requests found
...@@ -2,11 +2,13 @@ use std::fmt; ...@@ -2,11 +2,13 @@ use std::fmt;
// ast // ast
pub type Id = String;
// println!("{:?}", ..) // println!("{:?}", ..)
#[derive(Debug)] #[derive(Debug)]
pub enum NumOrId { pub enum NumOrId {
Num(usize), Num(i32),
Id(String), Id(Id),
} }
// println!("{}", ..) // println!("{}", ..)
...@@ -19,3 +21,11 @@ impl fmt::Display for NumOrId { ...@@ -19,3 +21,11 @@ impl fmt::Display for NumOrId {
Ok(()) Ok(())
} }
} }
pub type Stmts = Vec<Stmt>;
#[derive(Debug)]
pub enum Stmt {
Let(Id, NumOrId),
If(Id, Stmts, Option<Stmts>),
}
...@@ -5,6 +5,7 @@ lalrpop_mod!(pub parser, "/ast/parser.rs"); ...@@ -5,6 +5,7 @@ lalrpop_mod!(pub parser, "/ast/parser.rs");
use parser::*; use parser::*;
pub mod ast; pub mod ast;
use ast::*;
fn main() { fn main() {
println!("minimal"); println!("minimal");
...@@ -26,3 +27,29 @@ fn parse_num_or_id() { ...@@ -26,3 +27,29 @@ fn parse_num_or_id() {
"a1_a" "a1_a"
); );
} }
type Error = String;
fn type_check(stmts: &Stmts) -> Result<(), Error> {
for i in stmts {
match i {
Stmt::Let(_, _) => {
println!("let");
}
Stmt::If(_, _, __) => {
println!("if");
}
}
}
Ok(())
}
#[test]
fn test_stmts() {
let stmts = vec![
Stmt::Let("a".to_string(), NumOrId::Num(1)),
Stmt::Let("b".to_string(), NumOrId::Num(2)),
Stmt::Let("c".to_string(), NumOrId::Num(3)),
];
type_check(&stmts).unwrap();
}
...@@ -9,8 +9,8 @@ pub NumOrId: NumOrId = { ...@@ -9,8 +9,8 @@ pub NumOrId: NumOrId = {
Id => NumOrId::Id(<>), Id => NumOrId::Id(<>),
} }
pub Num: usize = { pub Num: i32 = {
r"[0-9]+" => usize::from_str(<>).unwrap(), r"[0-9]+" => i32::from_str(<>).unwrap(),
}; };
pub Id: String = { pub Id: String = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment