Skip to content

Commit 442f16e

Browse files
WIP
1 parent 62e2a84 commit 442f16e

3 files changed

Lines changed: 44 additions & 23 deletions

File tree

prism_compiler/src/parser/eat.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl<'a> ParserPrismEnv<'a> {
1919
}
2020

2121
pub fn eat_keyword(&mut self, expected_str: &str) -> PResult<Span> {
22-
let token = self.eat_token(Expected::Literal(expected_str.to_string()), |token, env| {
22+
self.eat_token(Expected::Literal(expected_str.to_string()), |token, env| {
2323
if let Token::Identifier { span, .. } = token
2424
&& env.db.input.inner().slice(span) == expected_str
2525
{
@@ -28,8 +28,8 @@ impl<'a> ParserPrismEnv<'a> {
2828
} else {
2929
false
3030
}
31-
})?;
32-
Ok(token.span())
31+
})
32+
.map(|tok| tok.span())
3333
}
3434

3535
pub fn eat_paren_open(&mut self, open: &str) -> PResult<()> {
@@ -57,4 +57,27 @@ impl<'a> ParserPrismEnv<'a> {
5757
})
5858
.map(|_| ())
5959
}
60+
61+
pub fn eat_identifier(&mut self) -> PResult<Span> {
62+
self.eat_token(Expected::Rule("identifier".to_string()), |token, _env| {
63+
matches!(token, Token::Identifier { .. })
64+
})
65+
.map(|tok| tok.span())
66+
}
67+
68+
pub fn eat_symbol(&mut self, expected_symbol: char) -> PResult<Span> {
69+
self.eat_token(
70+
Expected::Literal(expected_symbol.to_string()),
71+
|token, env| {
72+
if let Token::Symbol(span) = token
73+
&& env.db.input.inner().slice(span) == String::from_iter([expected_symbol])
74+
{
75+
true
76+
} else {
77+
false
78+
}
79+
},
80+
)
81+
.map(|tok| tok.span())
82+
}
6083
}

prism_compiler/src/parser/expect.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ pub type PResult<T> = Result<T, ExpectedGuaranteed>;
1010

1111
pub enum Expected {
1212
Literal(String),
13+
Rule(String),
1314
}
1415

1516
impl Display for Expected {
1617
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1718
match self {
1819
Expected::Literal(exp) => write!(f, "`{exp}`"),
20+
Expected::Rule(rule) => write!(f, "{rule}"),
1921
}
2022
}
2123
}

prism_compiler/src/parser/mod.rs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,22 @@ impl<'a> ParserPrismEnv<'a> {
7070
}
7171

7272
fn parse_expr(&mut self) -> PResult<CoreIndex> {
73-
self.parse_base()
73+
self.parse_statement()
7474
}
7575

76-
// fn parse_statement(&mut self) -> PResult<()> {
77-
// if self.eat_lit("let").is_ok() {
78-
// return Ok(())
79-
// } else if self.eat_lit("adapt").is_ok() {
80-
// return Ok(())
81-
// } else {
82-
// return Err(self.fail())
83-
// }
84-
// }
76+
fn parse_statement(&mut self) -> PResult<CoreIndex> {
77+
if let Ok(kw) = self.eat_keyword("let") {
78+
let name = self.eat_identifier()?;
79+
let _ = self.eat_symbol('=')?;
80+
let value = self.parse_base()?;
81+
let _ = self.eat_symbol(';')?;
82+
let body = self.parse_statement()?;
83+
// let span = kw.start_pos().span_to(self)
84+
Ok(self.store(CorePrismExpr::Let(), span))
85+
} else {
86+
self.parse_base()
87+
}
88+
}
8589

8690
fn parse_base(&mut self) -> PResult<CoreIndex> {
8791
if let Ok(span) = self.eat_keyword("Type") {
@@ -90,19 +94,11 @@ impl<'a> ParserPrismEnv<'a> {
9094
let expr = self.parse_expr()?;
9195
self.eat_paren_close(")")?;
9296
Ok(expr)
97+
} else if let Ok(ident) = self.eat_identifier() {
98+
Ok(self.store(CorePrismExpr::DeBruijnIndex(0), ident))
9399
} else {
94100
Err(self.fail())
95101
}
96-
97-
// if let Ok(span) = self.eat_lit("Type") {
98-
// Ok(self.store(CorePrismExpr::Type, span))
99-
// } else if let Ok(paren_ctx) = self.eat_open_paren("(", ")") {
100-
// let expr = self.parse_expr()?;
101-
// self.eat_close_paren(paren_ctx)?;
102-
// Ok(expr)
103-
// } else {
104-
// Err(self.fail())
105-
// }
106102
}
107103

108104
pub fn store(&mut self, e: CorePrismExpr, span: Span) -> CoreIndex {

0 commit comments

Comments
 (0)