Add the pre-processor
This commit is contained in:
parent
acb27abb34
commit
d0e56a8603
@ -72,6 +72,36 @@ peg::parser! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn preprocess(input: &str) -> String {
|
||||||
|
let mut stack = vec![0];
|
||||||
|
let mut output = String::new();
|
||||||
|
for line in input.lines() {
|
||||||
|
let mut count = 0;
|
||||||
|
for c in line.chars() {
|
||||||
|
if c == ' ' || c == '\t' {
|
||||||
|
count += 1;
|
||||||
|
} else if c == '#' {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
let curr = stack.last().unwrap();
|
||||||
|
if curr < &count {
|
||||||
|
stack.push(count);
|
||||||
|
output.push_str(">>>");
|
||||||
|
} else if curr > &count {
|
||||||
|
while stack.last().unwrap() > &count {
|
||||||
|
output.push_str("<<<");
|
||||||
|
stack.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.push_str(line.trim());
|
||||||
|
output.push('\n');
|
||||||
|
}
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
@ -206,7 +236,26 @@ foo <- x -> y -> x * y";
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
];
|
];
|
||||||
|
|
||||||
assert_eq!(deelang_parser::program(prgm).unwrap(), expected);
|
assert_eq!(deelang_parser::program(prgm).unwrap(), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_preprocess() {
|
||||||
|
let prgm = r"
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
## Hello World";
|
||||||
|
let expected = r"
|
||||||
|
>>>.
|
||||||
|
>>>.
|
||||||
|
<<<.
|
||||||
|
>>>.
|
||||||
|
<<<<<<.
|
||||||
|
## Hello World
|
||||||
|
";
|
||||||
|
assert_eq!(preprocess(prgm), expected);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user