add support for a.f(b, c, d) syntax

This commit is contained in:
Mark 2023-10-27 14:21:56 +02:00
parent 09fbf2ab0a
commit e60714e020
2 changed files with 11 additions and 1 deletions

View File

@ -131,7 +131,7 @@ impl Source {
Some(ch) Some(ch)
} }
fn word_splitter(ch: char) -> bool { fn word_splitter(ch: char) -> bool {
ch.is_whitespace() || ".,;)}".contains(ch) ch.is_whitespace() || ".,;[](){}".contains(ch)
} }
pub fn peek_word(&self) -> &str { pub fn peek_word(&self) -> &str {
self.src[self.i..] self.src[self.i..]

View File

@ -49,6 +49,16 @@ pub fn parse(src: &mut Source) -> Result<Option<Box<dyn program::parsed::MersSta
if let Some('.') = src.peek_char() { if let Some('.') = src.peek_char() {
src.next_char(); src.next_char();
let chained = parse_no_chain(src)?.expect("err: EOF instead of chain"); let chained = parse_no_chain(src)?.expect("err: EOF instead of chain");
// allow a.f(b, c) syntax (but not f(a, b, c))
if let Some('(') = src.peek_char() {
let pos_in_src = src.get_pos();
src.next_char();
let elems = parse_multiple(src, ")")?;
first = Box::new(program::parsed::tuple::Tuple {
pos_in_src: (pos_in_src, src.get_pos()).into(),
elems: [first].into_iter().chain(elems).collect(),
});
}
first = Box::new(program::parsed::chain::Chain { first = Box::new(program::parsed::chain::Chain {
pos_in_src: (pos_in_src, src.get_pos()).into(), pos_in_src: (pos_in_src, src.get_pos()).into(),
first, first,