Properly lex ?, |, \f, and =

This commit is contained in:
ConnorSkees 2020-01-20 11:39:05 -05:00
parent 37ad341f91
commit 0824a019c2
2 changed files with 13 additions and 1 deletions

View File

@ -62,6 +62,10 @@ pub enum Symbol {
DoubleQuote, DoubleQuote,
/// ' /// '
SingleQuote, SingleQuote,
/// ?
QuestionMark,
/// \
BackSlash,
} }
impl Display for Symbol { impl Display for Symbol {
@ -94,6 +98,8 @@ impl Display for Symbol {
Self::Percent => write!(f, "%"), Self::Percent => write!(f, "%"),
Self::DoubleQuote => write!(f, "\""), Self::DoubleQuote => write!(f, "\""),
Self::SingleQuote => write!(f, "'"), Self::SingleQuote => write!(f, "'"),
Self::QuestionMark => write!(f, "?"),
Self::BackSlash => write!(f, "\\"),
} }
} }
} }
@ -130,6 +136,8 @@ impl TryFrom<char> for Symbol {
'%' => Ok(Self::Percent), '%' => Ok(Self::Percent),
'"' => Ok(Self::DoubleQuote), '"' => Ok(Self::DoubleQuote),
'\'' => Ok(Self::SingleQuote), '\'' => Ok(Self::SingleQuote),
'?' => Ok(Self::QuestionMark),
'\\' => Ok(Self::BackSlash),
_ => Err("invalid symbol"), _ => Err("invalid symbol"),
} }
} }

View File

@ -43,12 +43,15 @@ impl<'a> Iterator for Lexer<'a> {
'(' => symbol!(self, OpenParen), '(' => symbol!(self, OpenParen),
')' => symbol!(self, CloseParen), ')' => symbol!(self, CloseParen),
'+' => symbol!(self, Plus), '+' => symbol!(self, Plus),
'=' => symbol!(self, Equal),
'?' => symbol!(self, QuestionMark),
'\\' => symbol!(self, BackSlash),
'~' => symbol!(self, Tilde), '~' => symbol!(self, Tilde),
'\'' => symbol!(self, SingleQuote), '\'' => symbol!(self, SingleQuote),
'"' => symbol!(self, DoubleQuote), '"' => symbol!(self, DoubleQuote),
' ' => whitespace!(self, Space), ' ' => whitespace!(self, Space),
'\t' => whitespace!(self, Tab), '\t' => whitespace!(self, Tab),
'\n' => { '\n' | '\x0C' => {
self.buf.next(); self.buf.next();
self.pos.newline(); self.pos.newline();
TokenKind::Whitespace(Whitespace::Newline) TokenKind::Whitespace(Whitespace::Newline)
@ -62,6 +65,7 @@ impl<'a> Iterator for Lexer<'a> {
'*' => symbol!(self, Mul), '*' => symbol!(self, Mul),
'}' => symbol!(self, CloseCurlyBrace), '}' => symbol!(self, CloseCurlyBrace),
'&' => symbol!(self, BitAnd), '&' => symbol!(self, BitAnd),
'|' => symbol!(self, BitOr),
'/' => self.lex_forward_slash(), '/' => self.lex_forward_slash(),
'%' => { '%' => {
self.buf.next(); self.buf.next();