lexer: parse comments
This commit is contained in:
parent
4b879a5516
commit
9ad58620d6
2 changed files with 58 additions and 2 deletions
52
src/lexer.rs
52
src/lexer.rs
|
@ -1,5 +1,6 @@
|
||||||
#[derive(PartialEq, Eq, Clone, Debug)]
|
#[derive(PartialEq, Eq, Clone, Debug)]
|
||||||
pub enum LTIRToken {
|
pub enum LTIRToken {
|
||||||
|
Comment(String),
|
||||||
Symbol(String),
|
Symbol(String),
|
||||||
Char(char),
|
Char(char),
|
||||||
Num(i64),
|
Num(i64),
|
||||||
|
@ -29,6 +30,7 @@ pub enum LexError {
|
||||||
#[derive(PartialEq, Eq, Clone, Debug)]
|
#[derive(PartialEq, Eq, Clone, Debug)]
|
||||||
pub enum LexerState {
|
pub enum LexerState {
|
||||||
Any,
|
Any,
|
||||||
|
Comment(String),
|
||||||
TypeTerm(String),
|
TypeTerm(String),
|
||||||
Sym(String),
|
Sym(String),
|
||||||
Num(i64),
|
Num(i64),
|
||||||
|
@ -39,6 +41,7 @@ impl LexerState {
|
||||||
fn into_token(self) -> Option<LTIRToken> {
|
fn into_token(self) -> Option<LTIRToken> {
|
||||||
match self {
|
match self {
|
||||||
LexerState::Any => None,
|
LexerState::Any => None,
|
||||||
|
LexerState::Comment(s) => Some(LTIRToken::Comment(s)),
|
||||||
LexerState::TypeTerm(s) => Some(LTIRToken::AssignType(s)),
|
LexerState::TypeTerm(s) => Some(LTIRToken::AssignType(s)),
|
||||||
LexerState::Sym(s) => Some(LTIRToken::Symbol(s)),
|
LexerState::Sym(s) => Some(LTIRToken::Symbol(s)),
|
||||||
LexerState::Num(n) => Some(LTIRToken::Num(n)),
|
LexerState::Num(n) => Some(LTIRToken::Num(n)),
|
||||||
|
@ -169,6 +172,22 @@ where
|
||||||
region.end += 1;
|
region.end += 1;
|
||||||
state = LexerState::Char(None);
|
state = LexerState::Char(None);
|
||||||
}
|
}
|
||||||
|
'/' => {
|
||||||
|
self.chars.next();
|
||||||
|
self.position += 1;
|
||||||
|
region.end += 1;
|
||||||
|
|
||||||
|
match self.chars.next() {
|
||||||
|
Some('*') => {
|
||||||
|
self.position += 1;
|
||||||
|
region.end += 1;
|
||||||
|
state = LexerState::Comment(String::new());
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return Some((region, Err(LexError::InvalidChar)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
c => {
|
c => {
|
||||||
if c.is_whitespace() {
|
if c.is_whitespace() {
|
||||||
self.chars.next();
|
self.chars.next();
|
||||||
|
@ -183,6 +202,38 @@ where
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
LexerState::Comment(s) => {
|
||||||
|
|
||||||
|
match self.chars.next() {
|
||||||
|
Some('*') => {
|
||||||
|
match self.chars.peek() {
|
||||||
|
Some('/') => {
|
||||||
|
self.chars.next();
|
||||||
|
self.position += 2;
|
||||||
|
region.end += 2;
|
||||||
|
|
||||||
|
if let Some(token) = state.clone().into_token() {
|
||||||
|
return Some((region, Ok(token)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
s.push('*');
|
||||||
|
self.position += 1;
|
||||||
|
region.end += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(c) => {
|
||||||
|
s.push(c);
|
||||||
|
self.position += 1;
|
||||||
|
region.end += 1;
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
return Some((region, Err(LexError::InvalidChar)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LexerState::Char(val) => {
|
LexerState::Char(val) => {
|
||||||
self.position += 2;
|
self.position += 2;
|
||||||
region.end += 2;
|
region.end += 2;
|
||||||
|
@ -288,6 +339,7 @@ mod tests {
|
||||||
fn test_lexer() {
|
fn test_lexer() {
|
||||||
let mut lexer = crate::lexer::LTIRLexer::from(
|
let mut lexer = crate::lexer::LTIRLexer::from(
|
||||||
"let var1:ℕ=123;
|
"let var1:ℕ=123;
|
||||||
|
/* comment */
|
||||||
let square =λx.* x x;
|
let square =λx.* x x;
|
||||||
|
|
||||||
let sqrt = λx:ℝ~machine::Float64~machine::Word.(f64-sqrt x);
|
let sqrt = λx:ℝ~machine::Float64~machine::Word.(f64-sqrt x);
|
||||||
|
|
|
@ -26,7 +26,12 @@ fn compile(
|
||||||
.compile(
|
.compile(
|
||||||
&parser::parse_expr(
|
&parser::parse_expr(
|
||||||
&scope.read().unwrap().typectx,
|
&scope.read().unwrap().typectx,
|
||||||
&mut lexer::LTIRLexer::from(source.chars().peekable()).peekable(),
|
&mut lexer::LTIRLexer::from(source.chars().peekable())
|
||||||
|
.filter(|tok| match tok {
|
||||||
|
(_, Ok(lexer::LTIRToken::Comment(_))) => false,
|
||||||
|
_ => true
|
||||||
|
})
|
||||||
|
.peekable(),
|
||||||
)
|
)
|
||||||
.expect("syntax error"),
|
.expect("syntax error"),
|
||||||
)
|
)
|
||||||
|
@ -35,7 +40,6 @@ fn compile(
|
||||||
|
|
||||||
|
|
||||||
/* TODO:
|
/* TODO:
|
||||||
* - Parse Comments
|
|
||||||
* - write to address resulting from expression
|
* - write to address resulting from expression
|
||||||
* - `::` -> '.' and allow ↦ only
|
* - `::` -> '.' and allow ↦ only
|
||||||
* - Parser error reporting
|
* - Parser error reporting
|
||||||
|
|
Loading…
Reference in a new issue