Skip to content

Commit 638a96b

Browse files
committed
WIP
Signed-off-by: squeakbug <[email protected]>
1 parent 1ebfcc1 commit 638a96b

File tree

6 files changed

+325
-183
lines changed

6 files changed

+325
-183
lines changed

crates/core/src/ast.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,15 @@ pub struct VarDeclaration {
141141
}
142142

143143
#[derive(Debug, Clone)]
144-
pub struct ProcedureDeclaration {
144+
pub struct ProcedureHeadDeclaration {
145145
pub name: String,
146-
pub params: Vec<(String, String)>,
146+
pub params: Vec<(String, Option<String>, Option<Box<Expr>>)>,
147147
pub return_type: Option<TypeDeclaration>,
148+
}
149+
150+
#[derive(Debug, Clone)]
151+
pub struct ProcedureDeclaration {
152+
pub head: ProcedureHeadDeclaration,
148153
pub body: Box<Stmt>,
149154
}
150155

crates/core/src/diagnostic.rs

Whitespace-only changes.

crates/core/src/lexer.rs

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,21 @@ pub struct Token {
105105
pub end_pos: usize,
106106
}
107107

108+
impl AsRef<Token> for Token {
109+
fn as_ref(&self) -> &Token {
110+
self
111+
}
112+
}
113+
114+
impl From<&Token> for SrcSpan {
115+
fn from(value: &Token) -> Self {
116+
SrcSpan {
117+
start: value.start_pos,
118+
end: value.end_pos,
119+
}
120+
}
121+
}
122+
108123
pub struct Lexer<T: Iterator<Item = char>> {
109124
istream: T,
110125
ostream: Vec<Token>,
@@ -237,21 +252,17 @@ where
237252
self.ostream.push(token);
238253
}
239254

240-
fn space(&mut self) {
241-
while let Some(c) = self.peek() {
242-
match c {
243-
' ' | '\t' | '\n' => {
244-
let _ = self.next_char();
245-
}
246-
_ => break,
247-
}
255+
fn is_space(&mut self, chr: char) -> bool {
256+
match chr {
257+
' ' | '\t' | '\n' => true,
258+
_ => false,
248259
}
249260
}
250261

251-
fn separator(&mut self) {
252-
if let Some(';') = self.peek() {
253-
self.add_tok1(TokenType::Semicolon);
254-
self.next_char();
262+
fn is_separator(&mut self, chr: char) -> bool {
263+
match chr {
264+
';' => true,
265+
_ => false,
255266
}
256267
}
257268

@@ -417,13 +428,14 @@ where
417428
let mut literal = String::new();
418429
let start_pos = self.get_pos();
419430
loop {
420-
match self.next_char() {
431+
match self.peek() {
421432
Some('\'') => {
422433
break;
423434
},
424435
Some(chr) => {
425436
// may cause reallocations, but it's not really important
426437
literal.push(chr);
438+
self.next_char();
427439
},
428440
None => return Err(LexerError {
429441
location: SrcSpan { start: start_pos, end: self.get_pos() },
@@ -523,13 +535,23 @@ where
523535
'+' => self.add_tok1(TokenType::Plus),
524536
'-' => self.add_tok1(TokenType::Minus),
525537
'*' => self.add_tok1(TokenType::Star),
526-
'/' => self.add_tok1(TokenType::Slash),
527538
'(' => self.add_tok1(TokenType::LeftParen),
528539
')' => self.add_tok1(TokenType::RightParen),
529540
'[' => self.add_tok1(TokenType::LeftBrack),
530541
']' => self.add_tok1(TokenType::RightBrack),
531542
'=' => self.add_tok1(TokenType::Equal),
532543
',' => self.add_tok1(TokenType::Comma),
544+
'/' => {
545+
self.next_char();
546+
match self.peek() {
547+
Some('/') => {
548+
self.next_char();
549+
let comment = self.lex_comment();
550+
self.ostream.push(comment);
551+
},
552+
_ => self.add_tok1(TokenType::Slash),
553+
}
554+
},
533555
'<' => {
534556
self.next_char();
535557
match self.peek() {
@@ -566,7 +588,8 @@ where
566588
_ => self.add_tok1(TokenType::Bleat),
567589
}
568590
},
569-
'"' => {
591+
'\'' => {
592+
self.next_char();
570593
let string = self.lex_string_literal()?;
571594
self.ostream.push(string);
572595
},
@@ -586,17 +609,20 @@ where
586609

587610
fn consume_normal(&mut self) -> Result<()> {
588611
if let Some(chr) = self.chr0 {
589-
self.space();
590-
self.separator();
591-
592-
if self.is_ident_start(chr) {
612+
if self.is_space(chr) {
613+
self.next_char();
614+
} else if self.is_separator(chr) {
615+
self.add_tok1(TokenType::Semicolon);
616+
self.next_char();
617+
} else if self.is_ident_start(chr) {
593618
let name = self.lex_ident()?;
594619
self.add_tok(name);
595620
} else if self.is_number_start(chr, self.chr1) {
596621
let num = self.lex_number()?;
597622
self.add_tok(num);
598623
} else {
599624
self.consume_character(chr)?;
625+
self.next_char();
600626
}
601627
} else {
602628
self.add_tok1(TokenType::Eof);
@@ -615,15 +641,15 @@ where
615641

616642
impl<T> Iterator for Lexer<T>
617643
where
618-
T: Iterator<Item = char,
644+
T: Iterator<Item = char>,
619645
{
620646
type Item = Result<Token>;
621647

622648
fn next(&mut self) -> Option<Self::Item> {
623-
let token = self.lex();
649+
let token = self.inner_next();
624650

625651
match token {
626-
Ok((_, Token::Eof, _)) => None,
652+
Ok(Token { kind: TokenType::Eof, .. }) => None,
627653
r => Some(r),
628654
}
629655
}
@@ -635,11 +661,15 @@ mod tests {
635661

636662
#[test]
637663
fn lex_arith() {
638-
let mut lexer = Lexer::new("y = x / (1 + 2) * 4".chars());
664+
let lexer = Lexer::new("y = x / (1 + 2) * 4".chars());
665+
let result = lexer.into_iter().collect::<Vec<_>>();
666+
let result = result.into_iter()
667+
.collect::<Result<Vec<_>, _>>()
668+
.unwrap().into_iter()
669+
.map(|tok| tok.kind)
670+
.collect::<Vec<_>>();
639671
assert_eq!(
640-
lexer.lex().unwrap()
641-
.into_iter()
642-
.map(|token| token.kind).collect::<Vec<_>>(),
672+
result,
643673
vec![
644674
TokenType::Identifier(String::from("y")),
645675
TokenType::Assignment,

0 commit comments

Comments
 (0)