Skip to content
Snippets Groups Projects
Commit ce4ae57a authored by Carlos Valencia's avatar Carlos Valencia
Browse files

hello world

parent 8ea8a655
No related branches found
No related tags found
No related merge requests found
......@@ -122,6 +122,63 @@ macro_rules! parser {
_b: std::marker::PhantomData
}
};
//Recursive
( $x:literal <~> ($($body:tt)*)) => {
crate::combinators::primitive_combinators::Zip {
parser_first: Char {c: $x},
parser_second: parser!($($body)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
( $x:ident <~> ($($body:tt)*)) => {
crate::combinators::primitive_combinators::Zip {
parser_first: $x,
parser_second: parser!($($body)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($body:tt)*) <~> $x:literal) => {
crate::combinators::primitive_combinators::Zip {
parser_first: parser!($($body)*),
parser_second: Char {c: $x},
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($body:tt)*) <~> $x:ident) => {
crate::combinators::primitive_combinators::Zip {
parser_first: parser!($($body)*),
parser_second: $x,
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($bodyL:tt)*) <~> ($($bodyR:tt)*)) => {
crate::combinators::primitive_combinators::Zip {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($bodyL:tt)*) <~> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Zip {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
// Zip
// Alternative
......@@ -329,7 +386,8 @@ macro_rules! parser {
};
// Recursive
($x:literal *> $($body:tt)*) => {
( $x:literal *> ($($body:tt)*)) => {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: Char {c: $x},
parser_second: parser!($($body)*),
......@@ -338,15 +396,50 @@ macro_rules! parser {
}
};
($x:ident *> $($body:tt)*) => {
( $x:ident *> ($($body:tt)*)) => {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: $x,
parser_second: parser!($rest),
parser_second: parser!($($body)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($body:tt)*) *> $x:literal) => {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: parser!($($body)*),
parser_second: Char {c: $x},
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($body:tt)*) *> $x:ident) => {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: parser!($($body)*),
parser_second: $x,
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($bodyL:tt)*) *> ($($bodyR:tt)*)) => {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($bodyL:tt)*) *> $($bodyR:tt)*) => {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
// ThenR
// ThenL
......@@ -417,6 +510,248 @@ macro_rules! parser {
_b: std::marker::PhantomData
}
};
// Recursive
( $x:literal <* ($($body:tt)*)) => {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: Char {c: $x},
parser_second: parser!($($body)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
( $x:ident <* ($($body:tt)*)) => {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: $x,
parser_second: parser!($($body)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($body:tt)*) <* $x:literal) => {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: parser!($($body)*),
parser_second: Char {c: $x},
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($body:tt)*) <* $x:ident) => {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: parser!($($body)*),
parser_second: $x,
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($bodyL:tt)*) <* ($($bodyR:tt)*)) => {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
(($($bodyL:tt)*) <* $($bodyR:tt)*) => {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
// ThenL
(($($body:tt)*) <|> $x:literal) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($($body)*),
parser_second: Char {c: $x},
_t: std::marker::PhantomData
}
};
(($($body:tt)*) <|> $x:ident) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($($body)*),
parser_second: $x,
_t: std::marker::PhantomData
}
};
(($($bodyL:tt)*) <|> ($($bodyR:tt)*)) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
(($($bodyL:tt)*) <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($($bodyL)*),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal <|> $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <|> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident <|> $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <|> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal <|> $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <|> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident <|> $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <|> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal <~> $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <~> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal <~> $y:literal <|> ($($bodyR:tt)*)) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <~> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident <~> $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <~> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal <~> $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <~> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident <~> $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <~> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal *> $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x *> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal *> $y:literal <|> ($($bodyR:tt)*)) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x *> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident *> $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x *> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal *> $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x *> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident *> $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x *> $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal *> $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <* $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal <* $y:literal <|> ($($bodyR:tt)*)) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <* $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident <* $y:literal <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <* $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:literal <* $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <* $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
($x:ident <* $y:ident <|> $($bodyR:tt)*) => {
crate::combinators::primitive_combinators::Alternative {
parser_first: parser!($x <* $y),
parser_second: parser!($($bodyR)*),
_t: std::marker::PhantomData
}
};
}
......@@ -3,6 +3,7 @@ pub mod macros;
#[cfg(test)]
mod tests {
use core::panic;
use std::result;
use crate::combinators::common::characters::Char;
use crate::parser::Parser;
......@@ -156,6 +157,11 @@ mod tests {
Err(_e) => ()
}
// match parser!(('c' <* ('a' <* 'r'))).parse("car") {
// Ok(c) => assert_eq!(c, 'c'),
// Err(e) => panic!("{}", e)
// }
match parser!(p3<*'x').parse("lx") {
Ok(c) => {
assert_eq!(c, 'l');
......@@ -187,11 +193,17 @@ mod tests {
Err(_e) => ()
}
let p = Char {c: 'a'};
match parser!('c' *> p *> 'r').parse("car") {
Ok(c) => assert_eq!(c, 'r'),
Err(e) => panic!("{}", e)
}
// let p = Char {c: 'a'};
// match parser!('c' *> p *> 'r').parse("car") {
// Ok(c) => assert_eq!(c, 'r'),
// Err(e) => panic!("{}", e)
// }
// let p = Char {c: 'c'};
// match parser!((p *> 'a' *> 'r')).parse("car") {
// Ok(c) => assert_eq!(c, 'r'),
// Err(e) => panic!("{}", e)
// }
match parser!(p3*>'x').parse("lx") {
Ok(c) => {
......@@ -202,4 +214,141 @@ mod tests {
}
}
#[test]
fn test_recursive() -> Result<(), String> {
match parser!(('a' *> 'b') <|> 'c').parse("ab") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
match parser!(('a' *> 'b') <|> 'c').parse("cb") {
Ok(c) => assert_eq!(c, 'c'),
Err(e) => panic!("{}", e)
}
let p = Char {c: 'c'};
match parser!(('a' *> 'b') <|> p).parse("ab") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
let p = Char {c: 'c'};
match parser!(p *> 'b' <|> 'k').parse("cb") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
match parser!(('a' <|> 'b') <|> 'c').parse("b") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
match parser!(('a' <|> 'b') <|> 'c').parse("b") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
match parser!('a' <|> 'b' <|> 'c').parse("b") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
match parser!('a' <|> 'b' <|> ('c' <|> 'c')).parse("b") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
let p = Char {c: 'a'};
match parser!(p <|> 'b' <|> ('c' <|> 'c') <|> 'l').parse("b") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
let p = Char {c: 'b'};
match parser!('a' <|> p <|> ('c' <|> 'c')).parse("b") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
let p1 = Char {c: 'a'};
let p2 = Char {c: 'b'};
match parser!(p1 <|> p2 <|> ('c' <|> 'c')).parse("b") {
Ok(c) => assert_eq!(c, 'b'),
Err(e) => panic!("{}", e)
}
match parser!(('a' <~> 'b') <|> ('c' <~> 'c')).parse("cc") {
Ok((c1, c2)) => {
assert_eq!(c1, 'c');
assert_eq!(c2, 'c');
},
Err(e) => panic!("{}", e)
}
match parser!('a' <~> 'b' <|> ('c' <~> 'c')).parse("cc") {
Ok((c1, c2)) => {
assert_eq!(c1, 'c');
assert_eq!(c2, 'c');
},
Err(e) => panic!("{}", e)
}
match parser!(('a' *> 'b') *> 'c').parse("abc") {
Ok(c) => assert_eq!(c, 'c'),
Err(e) => panic!("{}", e)
}
let p = Char {c: 'a'};
match parser!(p *> ('b' *> 'c')).parse("abc") {
Ok(c) => assert_eq!(c, 'c'),
Err(e) => panic!("{}", e)
}
match parser!(('a' <* 'b') <* 'c').parse("abc") {
Ok(c) => assert_eq!(c, 'a'),
Err(e) => panic!("{}", e)
}
match parser!('a' <* ('b' <* 'c')).parse("abc") {
Ok(c) => assert_eq!(c, 'a'),
Err(e) => panic!("{}", e)
}
match parser!(('a' <~> 'b') <~> 'c').parse("abc") {
Ok(((a, b), c)) => {
assert_eq!(a, 'a');
assert_eq!(b, 'b');
assert_eq!(c, 'c');
},
Err(e) => panic!("{}", e)
}
match parser!('a' <~> ('b' <~> 'c')).parse("abc") {
Ok((a, (b, c))) => {
assert_eq!(a, 'a');
assert_eq!(b, 'b');
assert_eq!(c, 'c');
},
Err(e) => panic!("{}", e)
}
Ok(())
}
#[test]
fn test_hello_world() -> Result<(), String> {
let p = parser!(('h' *> (((('e' *> 'l') *> 'l') *> 'o') <|> 'i')) *> ((((' '*> ('w' *> 'o')) *> 'r') *> 'l') *>'d'));
match p.parse("hello world") {
Ok(_c) => (),
Err(e) => panic!("{}", e)
}
match p.parse("hi world") {
Ok(_c) => (),
Err(e) => panic!("{}", e)
}
Ok(())
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment