- fixed lexing of inline and postline comments
This commit is contained in:
parent
34573a999e
commit
bcb32b19d4
3 changed files with 18 additions and 12 deletions
14
src/cell.rs
14
src/cell.rs
|
|
@ -59,6 +59,7 @@ pub fn cons (l_ctr: Ctr, r_ctr: Ctr) -> Cell {
|
|||
*/
|
||||
pub fn cell_as_string(c: &Cell, with_parens: bool) -> String {
|
||||
let mut string = String::new();
|
||||
let mut prn_space = true;
|
||||
match &c.car {
|
||||
Ctr::SYMBOL(s) => string.push_str(&s),
|
||||
Ctr::STRING(s) => {
|
||||
|
|
@ -70,10 +71,13 @@ pub fn cell_as_string(c: &Cell, with_parens: bool) -> String {
|
|||
Ctr::FLOAT(f) => string = string + &f.to_string(),
|
||||
Ctr::BOOL(b) => string = string + &b.to_string(),
|
||||
Ctr::CELL(c) => string.push_str(cell_as_string(&c, true).as_str()),
|
||||
Ctr::None => string.push_str("nil")
|
||||
Ctr::None => prn_space = false
|
||||
}
|
||||
|
||||
if prn_space {
|
||||
string.push(' ');
|
||||
}
|
||||
|
||||
string.push(' ');
|
||||
match &c.cdr {
|
||||
Ctr::SYMBOL(s) => string.push_str(&s),
|
||||
Ctr::STRING(s) => {
|
||||
|
|
@ -85,7 +89,11 @@ pub fn cell_as_string(c: &Cell, with_parens: bool) -> String {
|
|||
Ctr::FLOAT(f) => string = string + &f.to_string(),
|
||||
Ctr::BOOL(b) => string = string + &b.to_string(),
|
||||
Ctr::CELL(c) => string.push_str(cell_as_string(&c, false).as_str()),
|
||||
Ctr::None => string.push_str("nil")
|
||||
Ctr::None => {
|
||||
if prn_space {
|
||||
string.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: maybe a better way to do this
|
||||
|
|
|
|||
|
|
@ -85,6 +85,7 @@ fn process(document: String) -> Result<Box<Cell>, String> {
|
|||
needs_alloc = true;
|
||||
// reset comment line status
|
||||
if delim == '\n' {
|
||||
delim_stack.pop();
|
||||
ign = false;
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,10 +4,9 @@ mod lex_tests {
|
|||
#[test]
|
||||
fn test_lex_basic_pair() {
|
||||
let document: &str = "(hello 'world')";
|
||||
let output: &str = "(hello 'world' nil)";
|
||||
match lex(document.to_string()) {
|
||||
Ok(box_cell) => {
|
||||
assert_eq!(format!("{}", *box_cell), output.to_string());
|
||||
assert_eq!(format!("{}", *box_cell), document);
|
||||
},
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -19,10 +18,9 @@ mod lex_tests {
|
|||
#[test]
|
||||
fn test_lex_basic_list() {
|
||||
let document: &str = "(hello 'world' 1 2 3)";
|
||||
let output: &str = "(hello 'world' 1 2 3 nil)";
|
||||
match lex(document.to_string()) {
|
||||
Ok(box_cell) => {
|
||||
assert_eq!(format!("{}", *box_cell), output.to_string());
|
||||
assert_eq!(format!("{}", *box_cell), document);
|
||||
},
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -34,10 +32,9 @@ mod lex_tests {
|
|||
#[test]
|
||||
fn test_lex_complex_list() {
|
||||
let document: &str = "(hello 'world' (1 2 (1 2 3)) 1 2 3)";
|
||||
let output: &str = "(hello 'world' (1 2 (1 2 3 nil) nil) 1 2 3 nil)";
|
||||
match lex(document.to_string()) {
|
||||
Ok(box_cell) => {
|
||||
assert_eq!(format!("{}", *box_cell), output.to_string());
|
||||
assert_eq!(format!("{}", *box_cell), document);
|
||||
},
|
||||
Err(s) => {
|
||||
print!("{}\n", s);
|
||||
|
|
@ -94,7 +91,7 @@ mod lex_tests {
|
|||
#[test]
|
||||
fn test_comment() {
|
||||
let document: &str = "#!/bin/relish\n(one two)";
|
||||
let output: &str = "(one two nil)";
|
||||
let output: &str = "(one two)";
|
||||
match lex(document.to_string()) {
|
||||
Ok(box_cell) => {
|
||||
assert_eq!(format!("{}", *box_cell), output.to_string());
|
||||
|
|
@ -109,7 +106,7 @@ mod lex_tests {
|
|||
#[test]
|
||||
fn test_postline_comment() {
|
||||
let document: &str = "#!/bin/relish\n((one two)# another doc comment\n(three four))";
|
||||
let output: &str = "(one two nil)";
|
||||
let output: &str = "((one two) (three four))";
|
||||
match lex(document.to_string()) {
|
||||
Ok(box_cell) => {
|
||||
assert_eq!(format!("{}", *box_cell), output.to_string());
|
||||
|
|
@ -124,7 +121,7 @@ mod lex_tests {
|
|||
#[test]
|
||||
fn test_inline_comment() {
|
||||
let document: &str = "#!/bin/relish\n((one two)\n# another doc comment\nthree)";
|
||||
let output: &str = "(one two nil)";
|
||||
let output: &str = "((one two) three)";
|
||||
match lex(document.to_string()) {
|
||||
Ok(box_cell) => {
|
||||
assert_eq!(format!("{}", *box_cell), output.to_string());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue