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

Added recursive macros

parent 213829f4
No related branches found
No related tags found
No related merge requests found
......@@ -2,15 +2,14 @@ mod parser;
use parser::{Parser};
#[macro_use]
mod preprocessor;
mod combinators;
#[macro_use]
mod preprocessor;
fn main() {
}
......@@ -261,7 +261,7 @@ macro_rules! parser {
// ThenR
( $x:literal *> $y:literal ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: crate::combinators::common::characters::Char {c: $x},
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -269,7 +269,7 @@ macro_rules! parser {
}
};
( ($x:literal *> $y:literal) ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: crate::combinators::common::characters::Char {c: $x},
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -278,7 +278,7 @@ macro_rules! parser {
};
( $x:ident *> $y:literal ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: $x,
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -286,7 +286,7 @@ macro_rules! parser {
}
};
( ($x:ident *> $y:literal) ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: $x,
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -295,7 +295,7 @@ macro_rules! parser {
};
( $x:literal *> $y:ident ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: crate::combinators::common::characters::Char {c: $x},
parser_second: $y,
_a: std::marker::PhantomData,
......@@ -303,7 +303,7 @@ macro_rules! parser {
}
};
( ($x:literal *> $y:ident) ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: crate::combinators::common::characters::Char {c: $x},
parser_second: $y,
_a: std::marker::PhantomData,
......@@ -312,7 +312,7 @@ macro_rules! parser {
};
( $x:ident *> $y:ident ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: $x,
parser_second: $y,
_a: std::marker::PhantomData,
......@@ -320,18 +320,38 @@ macro_rules! parser {
}
};
( ($x:ident *> $y:ident) ) => {
crate::combinators::primitive_combinators::ThenR {
crate::combinators::non_primitive_combinators::ThenR {
parser_first: $x,
parser_second: $y,
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
// Recursive
($x:literal *> $($body:tt)*) => {
crate::combinators::non_primitive_combinators::ThenR {
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::ThenR {
parser_first: $x,
parser_second: parser!($rest),
_a: std::marker::PhantomData,
_b: std::marker::PhantomData
}
};
// ThenR
// ThenL
( $x:literal <* $y:literal ) => {
crate::combinators::primitive_combinators::ThenL {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: crate::combinators::common::characters::Char {c: $x},
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -339,7 +359,7 @@ macro_rules! parser {
}
};
( ($x:literal <* $y:literal) ) => {
crate::combinators::primitive_combinators::ThenL {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: crate::combinators::common::characters::Char {c: $x},
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -348,7 +368,7 @@ macro_rules! parser {
};
( $x:ident <* $y:literal ) => {
crate::combinators::primitive_combinators::ThenL {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: $x,
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -356,7 +376,7 @@ macro_rules! parser {
}
};
( ($x:ident <* $y:literal) ) => {
crate::combinators::primitive_combinators::ThenL {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: $x,
parser_second: crate::combinators::common::characters::Char {c: $y},
_a: std::marker::PhantomData,
......@@ -365,7 +385,7 @@ macro_rules! parser {
};
( $x:literal <* $y:ident ) => {
crate::combinators::primitive_combinators::ThenL {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: crate::combinators::common::characters::Char {c: $x},
parser_second: $y,
_a: std::marker::PhantomData,
......@@ -382,7 +402,7 @@ macro_rules! parser {
};
( $x:ident <* $y:ident ) => {
crate::combinators::primitive_combinators::ThenL {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: $x,
parser_second: $y,
_a: std::marker::PhantomData,
......@@ -390,7 +410,7 @@ macro_rules! parser {
}
};
( ($x:ident <* $y:ident) ) => {
crate::combinators::primitive_combinators::ThenL {
crate::combinators::non_primitive_combinators::ThenL {
parser_first: $x,
parser_second: $y,
_a: std::marker::PhantomData,
......
......@@ -134,4 +134,72 @@ mod tests {
Err(e) => panic!("{}", e)
}
}
#[test]
fn test_left() -> Result<(), String>{
let p = Char {c: 'c'};
let p2 = Char {c: 'k'};
let p3 = Char {c: 'l'};
match parser!('c'<*'x').parse("cx") {
Ok(c) => assert_eq!(c, 'c'),
Err(e) => panic!("{}", e)
}
match parser!(p<*p2).parse("ck") {
Ok(c) => assert_eq!(c, 'c'),
Err(e) => panic!("{}", e)
}
match parser!('c' <* 'm').parse("cl") {
Ok(_) => panic!("Didnt fail at m"),
Err(_e) => ()
}
match parser!(p3<*'x').parse("lx") {
Ok(c) => {
assert_eq!(c, 'l');
Ok(())
},
Err(e) => panic!("{}", e)
}
}
#[test]
fn test_right() -> Result<(), String>{
let p = Char {c: 'c'};
let p2 = Char {c: 'k'};
let p3 = Char {c: 'l'};
match parser!('c'*>'x').parse("cx") {
Ok(c) => assert_eq!(c, 'x'),
Err(e) => panic!("{}", e)
}
match parser!(p*>p2).parse("ck") {
Ok(c) => assert_eq!(c, 'k'),
Err(e) => panic!("{}", e)
}
match parser!('c' *> 'm').parse("cl") {
Ok(_) => panic!("Didnt fail at m"),
Err(_e) => ()
}
let p = Char {c: 'a'};
match parser!('c' *> p *> 'r').parse("car") {
Ok(c) => assert_eq!(c, 'r'),
Err(e) => panic!("{}", e)
}
match parser!(p3*>'x').parse("lx") {
Ok(c) => {
assert_eq!(c, 'x');
Ok(())
},
Err(e) => panic!("{}", e)
}
}
}
\ 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