diff --git a/demo/demo.rpy b/demo/demo.rpy index d986d46..f41016c 100644 --- a/demo/demo.rpy +++ b/demo/demo.rpy @@ -4,6 +4,9 @@ what the heck "this is a string with a # comment" "this is a string over multiple lines" +"this is \"escaped\"" +'this is a single quote string' +'this also has escaped \'quotes\'' this is cool # comment huh \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 8670d77..d6fb698 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,11 +19,22 @@ pub fn parse(file_path: &str) { for token in line.into_inner() { match token.as_rule() { Rule::token => { - println!("{}", token.as_str()); + let token = token.into_inner().next().unwrap(); + match token.as_rule() { + Rule::string => { + let string_data = token.into_inner().next().unwrap(); + let str = string_data.as_str(); + println!("string: {}", match string_data.as_rule() { + Rule::single_quote_string_data => str.replace("\\'", "'"), + Rule::double_quote_string_data => str.replace("\\\"", "\""), + _ => unreachable!(), + }); + }, + Rule::keyword => println!("keyword: {}", token.as_str()), + _ => unreachable!(), + }; }, - _ => { - println!("{}", token.as_str()); - } + _ => unreachable!(), } } println!() diff --git a/src/rpy.pest b/src/rpy.pest index 5fdaf5d..6ffbdbf 100644 --- a/src/rpy.pest +++ b/src/rpy.pest @@ -13,10 +13,18 @@ token = { string | keyword } // has to be atomic for no implicit separate (spaces) keyword = @{ (!(WHITESPACE | NEWLINE) ~ ANY)+ } -// strings cannot contain quotes -// TODO: escaped quotes -string_data = @{ (!"\"" ~ ANY)* } -string = ${ "\"" ~ string_data ~ "\"" } +single_quote_string_data = @{ ( + "\\'" // Escaped single quotes + | (!"'" ~ ANY) +)* } +double_quote_string_data = @{ ( + "\\\"" // Escaped double quotes + | (!"\"" ~ ANY) +)* } +string = ${ + ("'" ~ single_quote_string_data ~ "'") + | ("\"" ~ double_quote_string_data ~ "\"") +} // comments are a # followed by // any number of non-newline characters