Parse . operator
This commit is contained in:
parent
81c4566c2b
commit
505d23a327
@ -112,7 +112,7 @@ pub fn tokenize(input: &str) -> Vec<Token> {
|
|||||||
},
|
},
|
||||||
c if c.is_whitespace() && c != '\n' => continue,
|
c if c.is_whitespace() && c != '\n' => continue,
|
||||||
'\n' => Newline, ';' => Semicolon,
|
'\n' => Newline, ';' => Semicolon,
|
||||||
':' => Colon, ',' => Comma, '.' => Period,
|
':' => Colon, ',' => Comma,
|
||||||
'(' => LParen, ')' => RParen,
|
'(' => LParen, ')' => RParen,
|
||||||
'{' => LCurlyBrace, '}' => RCurlyBrace,
|
'{' => LCurlyBrace, '}' => RCurlyBrace,
|
||||||
'[' => LSquareBracket, ']' => RSquareBracket,
|
'[' => LSquareBracket, ']' => RSquareBracket,
|
||||||
@ -191,13 +191,14 @@ fn handle_alphabetic(c: char, input: &mut CharIter) -> TokenType {
|
|||||||
|
|
||||||
fn handle_operator(c: char, input: &mut CharIter) -> TokenType {
|
fn handle_operator(c: char, input: &mut CharIter) -> TokenType {
|
||||||
match c {
|
match c {
|
||||||
'<' | '>' | '|' => {
|
'<' | '>' | '|' | '.' => {
|
||||||
let ref next = input.peek().map(|&(_, c)| { c });
|
let ref next = input.peek().map(|&(_, c)| { c });
|
||||||
if !next.map(|n| { is_operator(&n) }).unwrap_or(false) {
|
if !next.map(|n| { is_operator(&n) }).unwrap_or(false) {
|
||||||
return match c {
|
return match c {
|
||||||
'<' => LAngleBracket,
|
'<' => LAngleBracket,
|
||||||
'>' => RAngleBracket,
|
'>' => RAngleBracket,
|
||||||
'|' => Pipe,
|
'|' => Pipe,
|
||||||
|
'.' => Period,
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,8 +223,6 @@ fn handle_operator(c: char, input: &mut CharIter) -> TokenType {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod schala_tokenizer_tests {
|
mod schala_tokenizer_tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use super::TokenType::*;
|
|
||||||
use super::Kw::*;
|
|
||||||
|
|
||||||
macro_rules! digit { ($ident:expr) => { DigitGroup(Rc::new($ident.to_string())) } }
|
macro_rules! digit { ($ident:expr) => { DigitGroup(Rc::new($ident.to_string())) } }
|
||||||
macro_rules! ident { ($ident:expr) => { Identifier(Rc::new($ident.to_string())) } }
|
macro_rules! ident { ($ident:expr) => { Identifier(Rc::new($ident.to_string())) } }
|
||||||
@ -571,6 +570,7 @@ impl Parser {
|
|||||||
loop {
|
loop {
|
||||||
let op_str = match self.peek() {
|
let op_str = match self.peek() {
|
||||||
Operator(op) => op,
|
Operator(op) => op,
|
||||||
|
Period => Rc::new(".".to_string()),
|
||||||
_ => break,
|
_ => break,
|
||||||
};
|
};
|
||||||
let new_precedence = Operation::get_precedence(op_str);
|
let new_precedence = Operation::get_precedence(op_str);
|
||||||
@ -579,6 +579,7 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
let op_str = match self.next() {
|
let op_str = match self.next() {
|
||||||
Operator(op) => op,
|
Operator(op) => op,
|
||||||
|
Period => Rc::new(".".to_string()),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
let rhs = self.precedence_expr(new_precedence)?;
|
let rhs = self.precedence_expr(new_precedence)?;
|
||||||
@ -758,7 +759,6 @@ mod parse_tests {
|
|||||||
use super::Statement::*;
|
use super::Statement::*;
|
||||||
use super::Declaration::*;
|
use super::Declaration::*;
|
||||||
use super::Expression::*;
|
use super::Expression::*;
|
||||||
use super::ParseError;
|
|
||||||
|
|
||||||
macro_rules! rc {
|
macro_rules! rc {
|
||||||
($string:tt) => { Rc::new(stringify!($string).to_string()) }
|
($string:tt) => { Rc::new(stringify!($string).to_string()) }
|
||||||
@ -780,6 +780,7 @@ mod parse_tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parsing_number_literals_and_binexps() {
|
fn parsing_number_literals_and_binexps() {
|
||||||
|
parse_test!(".2", AST(vec![Expression(FloatLiteral(0.2))]));
|
||||||
parse_test!("8.1", AST(vec![Expression(FloatLiteral(8.1))]));
|
parse_test!("8.1", AST(vec![Expression(FloatLiteral(8.1))]));
|
||||||
parse_test!("0b010", AST(vec![Expression(IntLiteral(2))]));
|
parse_test!("0b010", AST(vec![Expression(IntLiteral(2))]));
|
||||||
parse_test!("3; 4; 4.3", AST(
|
parse_test!("3; 4; 4.3", AST(
|
||||||
@ -811,6 +812,8 @@ mod parse_tests {
|
|||||||
[
|
[
|
||||||
Expression(binexp!(op!("*"), binexp!(op!("+"), IntLiteral(1), IntLiteral(2)), IntLiteral(3)))
|
Expression(binexp!(op!("*"), binexp!(op!("+"), IntLiteral(1), IntLiteral(2)), IntLiteral(3)))
|
||||||
]));
|
]));
|
||||||
|
|
||||||
|
parse_test!(".1 + .2", AST(vec![Expression(binexp!(op!("+"), FloatLiteral(0.1), FloatLiteral(0.2)))]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -828,6 +831,11 @@ mod parse_tests {
|
|||||||
parse_test!("a <- b", AST(vec![Expression(binexp!(op!("<-"), var!("a"), var!("b")))]));
|
parse_test!("a <- b", AST(vec![Expression(binexp!(op!("<-"), var!("a"), var!("b")))]));
|
||||||
parse_test!("a || b", AST(vec![Expression(binexp!(op!("||"), var!("a"), var!("b")))]));
|
parse_test!("a || b", AST(vec![Expression(binexp!(op!("||"), var!("a"), var!("b")))]));
|
||||||
parse_test!("a<>b", AST(vec![Expression(binexp!(op!("<>"), var!("a"), var!("b")))]));
|
parse_test!("a<>b", AST(vec![Expression(binexp!(op!("<>"), var!("a"), var!("b")))]));
|
||||||
|
parse_test!("a.b.c.d", AST(vec![Expression(binexp!(op!("."),
|
||||||
|
binexp!(op!("."),
|
||||||
|
binexp!(op!("."), var!("a"), var!("b")),
|
||||||
|
var!("c")),
|
||||||
|
var!("d")))]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user