Skip to content

Commit

Permalink
adding ifs
Browse files Browse the repository at this point in the history
  • Loading branch information
Richard authored and Richard committed Apr 5, 2019
1 parent 1ed4686 commit fddadd2
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 42 deletions.
Binary file modified examples/canvas/canvas.wasm
Binary file not shown.
14 changes: 7 additions & 7 deletions examples/canvas/main.w
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ extern canvas_fill_rect(canvas,x,y,w,h)
static colors = ("black","grey","red")

pub fn main(){
let( window global_get_window()
document window_get_document(window)
canvas document_query_selector(document,"#screen")
ctx htmlcanvas_get_context(canvas,"2d")
){
42
}
x = global_get_window()
document = window_get_document(window)
canvas = document_query_selector(document,"#screen")
ctx = htmlcanvas_get_context(canvas,"2d")
loop{
42
}
}
// (pub defn main []
// (let [window (global_get_window)
Expand Down
2 changes: 1 addition & 1 deletion examples/dynamic_dispatch/main.w
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ extern console_log(message)
fn heads(){ console_log("heads!") }
fn tails(){ console_log("tails!") }
pub fn main(h){
call((fnsig [] f64),if(==(h,1),heads,tails))
call(fn()->f64,if((h==1)){heads}else{tails})
}
4 changes: 3 additions & 1 deletion examples/helloworld/main.w
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
extern console_log(message)
pub fn main(){ console_log("hello world!") }
pub fn main(){
console_log("hello world!")
}
3 changes: 2 additions & 1 deletion examples/testing/main.w
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ fn is(c m){
if(c success m)
}

test multiplication {
pub fn test_multiplication {
if((4 == (2*2)))
is(==(4 *(2 2)) "2 * 2 should be 4")
is(==(1 *(1 1)) "1 * 1 should be 2")
}
Expand Down
99 changes: 67 additions & 32 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,36 @@ named!(
)
);

named!(
operator_identifiers<CompleteStr,String>,
do_parse!(
id: alt!(map!(tag!(">>"),to_string)|map!(tag!("<<"),to_string)|map!(tag!(">="),to_string)|map!(tag!("<="),to_string)|map!(tag!(">"),to_string)|map!(tag!("<"),to_string)|map!(tag!("or"),to_string)|map!(tag!("and"),to_string)|map!(tag!("!="),to_string)|map!(tag!("=="),to_string)|map!(tag!("+"),to_string)|map!(tag!("-"),to_string)|map!(tag!("*"),to_string)|map!(tag!("/"),to_string)|map!(tag!("%"),to_string)|map!(tag!("|"),to_string)|map!(tag!("&"),to_string))>>
(id)
)
);

named!(
unary_operator_identifiers<CompleteStr,String>,
do_parse!(
id: alt!(map!(tag!("^"),to_string)|map!(tag!("~"),to_string)|map!(tag!("!"),to_string))>>
(id)
)
);


named!(
function_identifiers<CompleteStr,String>,
do_parse!(
id: alt!(map!(tag!("call"),to_string)|token_identifier|map!(tag!("do"),to_string)|map!(tag!("if"),to_string)|map!(tag!(">>"),to_string)|map!(tag!("<<"),to_string)|map!(tag!(">="),to_string)|map!(tag!("<="),to_string)|map!(tag!(">"),to_string)|map!(tag!("<"),to_string)|map!(tag!("or"),to_string)|map!(tag!("and"),to_string)|map!(tag!("!="),to_string)|map!(tag!("=="),to_string)|map!(tag!("+"),to_string)|map!(tag!("-"),to_string)|map!(tag!("*"),to_string)|map!(tag!("/"),to_string)|map!(tag!("%"),to_string)|map!(tag!("|"),to_string)|map!(tag!("&"),to_string)|map!(tag!("^"),to_string)|map!(tag!("~"),to_string)|map!(tag!("!"),to_string))>>
id: alt!(map!(tag!("call"),to_string)|token_identifier|map!(tag!("do"),to_string)|map!(tag!("if"),to_string))>>
(id)
)
);


named!(
token_data_type<CompleteStr,DataType>,
do_parse!(
t: map!(alt!(tag!("i32")|tag!("i64")|tag!("f32")|tag!("f64")), to_string) >>
t: map!(alt!(tag!("()")|tag!("i32")|tag!("i64")|tag!("f32")|tag!("f64")), to_string) >>
(to_data_type(&t))
)
);
Expand Down Expand Up @@ -214,53 +232,34 @@ named!(expression_let<CompleteStr, Expression>,

named!(expression_loop<CompleteStr, Expression>,
do_parse!(
tag!("(") >>
many0!(ws!(token_comment)) >>
ws!(tag!("loop")) >>
many0!(ws!(token_comment)) >>
ws!(tag!("[")) >>
many0!(ws!(token_comment)) >>
bindings: ws!(many0!(ws!(expression_let_pair))) >>
many0!(ws!(token_comment)) >>
ws!(tag!("]")) >>
ws!(tag!("{")) >>
expressions: ws!(many1!(ws!(expression))) >>
tag!(")") >>
(Expression::Loop(OperationLoop{bindings:bindings,expressions:expressions}))
tag!("}") >>
(Expression::Loop(OperationLoop{bindings:vec![],expressions:expressions}))
)
);

named!(expression_recur<CompleteStr, Expression>,
do_parse!(
tag!("(") >>
many0!(ws!(token_comment)) >>
ws!(tag!("recur")) >>
many0!(ws!(token_comment)) >>
ws!(tag!("[")) >>
many0!(ws!(token_comment)) >>
bindings: ws!(many0!(ws!(expression_let_pair))) >>
many0!(ws!(token_comment)) >>
ws!(tag!("]")) >>
many0!(ws!(token_comment)) >>
tag!(")") >>
(Expression::Recur(OperationRecur{bindings:bindings}))
tag!("recur") >>
(Expression::Recur(OperationRecur{bindings:vec![]}))
)
);

named!(expression_fnsig<CompleteStr, Expression>,
do_parse!(
tag!("(") >>
many0!(ws!(token_comment)) >>
ws!(tag!("fnsig")) >>
ws!(tag!("fn")) >>
many0!(ws!(token_comment)) >>
ws!(tag!("[")) >>
ws!(tag!("(")) >>
many0!(ws!(token_comment)) >>
inputs: ws!(many0!(ws!(token_data_type))) >>
inputs: ws!(separated_list!(tag!(","),ws!(token_data_type))) >>
many0!(ws!(token_comment)) >>
ws!(tag!("]")) >>
ws!(tag!(")")) >>
ws!(tag!("->")) >>
many0!(ws!(token_comment)) >>
output: opt!(ws!(token_data_type)) >>
many0!(ws!(token_comment)) >>
tag!(")") >>
(Expression::FnSig(OperationFnSig{inputs:inputs, output:output}))
)
);
Expand All @@ -281,7 +280,7 @@ named!(expression_populate<CompleteStr, Expression>,
);

named!(expression<CompleteStr, Expression>,
alt!(expression_let|expression_function_call|expression_populate|expression_fnsig|expression_loop|expression_recur|expression_number|boolean_true|boolean_false|expression_comment|expression_literal_token|expression_literal_string|expression_identifier)
alt!(expression_if_statement|expression_fnsig|expression_let|expression_operator_call|expression_unary_operator_call|expression_function_call|expression_populate|expression_loop|expression_recur|expression_number|boolean_true|boolean_false|expression_comment|expression_literal_token|expression_literal_string|expression_identifier)
);

named!(function_params<CompleteStr, Vec<Expression>>,
Expand All @@ -291,6 +290,42 @@ named!(function_params<CompleteStr, Vec<Expression>>,
)
);

named!(expression_operator_call<CompleteStr, Expression>,
do_parse!(
tag!("(") >>
expr_a: ws!(expression) >>
function_name: ws!(operator_identifiers) >>
expr_b: ws!(expression) >>
tag!(")") >>
(Expression::FunctionCall(OperationFunctionCall{function_name:function_name,params:vec![expr_a,expr_b]}))
)
);

named!(expression_if_statement<CompleteStr, Expression>,
do_parse!(
ws!(tag!("if")) >>
ws!(tag!("(")) >>
expr_a: ws!(expression) >>
ws!(tag!(")")) >>
ws!(tag!("{")) >>
expr_b: ws!(expression) >>
tag!("}") >>
ws!(tag!("else")) >>
ws!(tag!("{")) >>
expr_c: ws!(expression) >>
tag!("}") >>
(Expression::FunctionCall(OperationFunctionCall{function_name:"if".to_string(),params:vec![expr_a,expr_b,expr_c]}))
)
);

named!(expression_unary_operator_call<CompleteStr, Expression>,
do_parse!(
function_name: ws!(unary_operator_identifiers) >>
expr_a: ws!(expression) >>
(Expression::FunctionCall(OperationFunctionCall{function_name:function_name,params:vec![expr_a]}))
)
);

named!(expression_function_call<CompleteStr, Expression>,
do_parse!(
function_name: ws!(function_identifiers) >>
Expand Down

0 comments on commit fddadd2

Please sign in to comment.