Implementing static path

This commit is contained in:
2026-05-04 16:39:55 +02:00
parent 77c6138965
commit 8faf663589
4 changed files with 30 additions and 11 deletions
+3
View File
@@ -16,6 +16,9 @@ pub enum TypeExpr {
Identifier(String),
}
#[derive(Debug, Clone, Serialize)]
pub struct StaticPath(pub Vec<String>);
#[derive(Debug, Clone, Serialize)]
pub enum BinaryOp {
Plus,
+9 -8
View File
@@ -4,12 +4,13 @@ COMMENT = _{ "//" ~ (!"\n" ~ ANY)* }
program = { SOI ~ top_level* ~ EOI }
// primitives
identifier = @{ (ASCII_ALPHA | "_") ~ (ASCII_ALPHANUMERIC | "_")* }
integer = @{ ASCII_DIGIT+ }
float = @{ ASCII_DIGIT+ ~ "." ~ ASCII_DIGIT+ }
boolean = { "true" | "false" }
string_lit = { "\"" ~ inner_str ~ "\"" }
inner_str = @{ (!"\"" ~ ANY)* }
identifier = @{ (ASCII_ALPHA | "_") ~ (ASCII_ALPHANUMERIC | "_")* }
integer = @{ ASCII_DIGIT+ }
float = @{ ASCII_DIGIT+ ~ "." ~ ASCII_DIGIT+ }
boolean = { "true" | "false" }
string_lit = { "\"" ~ inner_str ~ "\"" }
inner_str = @{ (!"\"" ~ ANY)* }
static_path = { identifier ~ ("::" ~ identifier)* }
export = { "public" }
mutable = { "mut" }
@@ -72,14 +73,14 @@ while_stmt = {
}
// ================= EXPRESSIONS =================
type_expr = { identifier }
type_expr = { static_path }
primary = {
integer
| float
| boolean
| string_lit
| identifier
| static_path
}
postfix = {
+17
View File
@@ -45,6 +45,23 @@ impl TryFrom<pest::iterators::Pair<'_, Rule>> for TypeExpr {
}
}
impl TryFrom<pest::iterators::Pair<'_, Rule>> for StaticPath {
type Error = ();
fn try_from(pair: pest::iterators::Pair<'_, Rule>) -> Result<Self, Self::Error> {
if pair.as_str() == "void" {
return Err(());
}
Ok(match pair.as_rule() {
Rule::static_path => {
StaticPath(pair.into_inner().map(|i| i.as_str().to_string()).collect())
}
_ => unimplemented!("{pair:#?}"),
})
}
}
impl From<pest::iterators::Pair<'_, Rule>> for FieldList {
fn from(pair: pest::iterators::Pair<Rule>) -> Self {
let params = pair
+1 -3
View File
@@ -1,3 +1 @@
int test(int mut b) {
int mut a = 10;
}
int test() {}