Rewriting statements
This commit is contained in:
@@ -13,7 +13,7 @@ inner_str = @{ (!"\"" ~ ANY)* }
|
|||||||
|
|
||||||
export = { "public" }
|
export = { "public" }
|
||||||
mutable = { "mut" }
|
mutable = { "mut" }
|
||||||
var_decl_1 = { type_expr ~ mutable? ~ identifier }
|
var_decl = { type_expr ~ mutable? ~ identifier }
|
||||||
|
|
||||||
// ================= TOP LEVEL =================
|
// ================= TOP LEVEL =================
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ import = { "import" ~ string_lit ~ ";" }
|
|||||||
field_list = { field ~ ("," ~ field)* ~ ","? }
|
field_list = { field ~ ("," ~ field)* ~ ","? }
|
||||||
field = { export? ~ type_expr ~ identifier }
|
field = { export? ~ type_expr ~ identifier }
|
||||||
|
|
||||||
param_list = { var_decl_1 ~ ("," ~ var_decl_1)* ~ ","? }
|
param_list = { var_decl ~ ("," ~ var_decl)* ~ ","? }
|
||||||
|
|
||||||
struct_decl = {
|
struct_decl = {
|
||||||
export? ~ "struct" ~ identifier ~ "{" ~ field_list? ~ "}"
|
export? ~ "struct" ~ identifier ~ "{" ~ field_list? ~ "}"
|
||||||
@@ -61,7 +61,7 @@ break_stmt = { "break" ~ ";" }
|
|||||||
|
|
||||||
continue_stmt = { "continue" ~ ";" }
|
continue_stmt = { "continue" ~ ";" }
|
||||||
|
|
||||||
var_decl_statement = { var_decl_1 ~ ";" }
|
var_decl_statement = { var_decl ~ ("=" ~ expr)? ~ ";" }
|
||||||
|
|
||||||
if_stmt = {
|
if_stmt = {
|
||||||
"if" ~ "(" ~ expr ~ ")" ~ statement ~ ("else" ~ statement)?
|
"if" ~ "(" ~ expr ~ ")" ~ statement ~ ("else" ~ statement)?
|
||||||
|
|||||||
+9
-47
@@ -17,6 +17,8 @@ pub type ParseError = pest::error::Error<Rule>;
|
|||||||
pub fn parse(source: &str) -> Result<Vec<TopLevel>, ParseError> {
|
pub fn parse(source: &str) -> Result<Vec<TopLevel>, ParseError> {
|
||||||
let mut pairs = MistParser::parse(Rule::program, source)?;
|
let mut pairs = MistParser::parse(Rule::program, source)?;
|
||||||
|
|
||||||
|
println!("{pairs:#?}");
|
||||||
|
|
||||||
let mut statements = vec![];
|
let mut statements = vec![];
|
||||||
|
|
||||||
for pair in pairs.next().unwrap().into_inner() {
|
for pair in pairs.next().unwrap().into_inner() {
|
||||||
@@ -180,15 +182,18 @@ impl From<pest::iterators::Pair<'_, Rule>> for Statement {
|
|||||||
|
|
||||||
Rule::block => Statement::Block(Block::from(pair.into_inner().next().unwrap())),
|
Rule::block => Statement::Block(Block::from(pair.into_inner().next().unwrap())),
|
||||||
|
|
||||||
Rule::var_decl => {
|
Rule::var_decl_statement => {
|
||||||
let mut inner = pair.into_inner();
|
let mut inner = pair.into_inner();
|
||||||
|
|
||||||
let type_ = inner.next().map(TypeExpr::try_from).unwrap().ok();
|
let mut var_decl = inner.next().unwrap().into_inner();
|
||||||
let name = inner.next().unwrap().as_str().to_string();
|
|
||||||
|
let type_ = var_decl.next().map(TypeExpr::try_from).unwrap().ok();
|
||||||
|
let name = var_decl.next().unwrap().as_str().to_string();
|
||||||
let init = inner.next().map(Expression::from);
|
let init = inner.next().map(Expression::from);
|
||||||
|
let mutable = inner.next().is_some();
|
||||||
|
|
||||||
Statement::VarDecl {
|
Statement::VarDecl {
|
||||||
mutable: false,
|
mutable,
|
||||||
name: name.as_str().to_string(),
|
name: name.as_str().to_string(),
|
||||||
init,
|
init,
|
||||||
type_,
|
type_,
|
||||||
@@ -234,49 +239,6 @@ impl From<pest::iterators::Pair<'_, Rule>> for Statement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rule::for_stmt => {
|
|
||||||
let mut inner = pair.into_inner();
|
|
||||||
|
|
||||||
let init = inner
|
|
||||||
.next()
|
|
||||||
.map(|p| match p.as_rule() {
|
|
||||||
Rule::var_decl => {
|
|
||||||
let mut it = p.into_inner();
|
|
||||||
|
|
||||||
let name = it.next().unwrap().as_str().to_string();
|
|
||||||
let init_expr = it
|
|
||||||
.next()
|
|
||||||
.map(|e| Expression::from(e.into_inner().next().unwrap()));
|
|
||||||
|
|
||||||
(false, name, init_expr)
|
|
||||||
}
|
|
||||||
_ => unimplemented!(
|
|
||||||
"For loop init parsing not implemented yet: {:?}",
|
|
||||||
p.as_rule()
|
|
||||||
),
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let condition = inner.next().map(Expression::from);
|
|
||||||
let update = inner.next().map(parse_var_assign_no_semicolon);
|
|
||||||
let body = Statement::from(inner.next().unwrap());
|
|
||||||
|
|
||||||
Statement::For {
|
|
||||||
init,
|
|
||||||
condition,
|
|
||||||
update: update.map(Box::new),
|
|
||||||
body: Box::new(body),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rule::var_assign => {
|
|
||||||
let mut inner = pair.into_inner();
|
|
||||||
let target = Expression::from(inner.next().unwrap());
|
|
||||||
let value = Expression::from(inner.next().unwrap());
|
|
||||||
|
|
||||||
Statement::VarAssign { target, value }
|
|
||||||
}
|
|
||||||
|
|
||||||
_ => unimplemented!(
|
_ => unimplemented!(
|
||||||
"Statement parsing not implemented yet: {:?}",
|
"Statement parsing not implemented yet: {:?}",
|
||||||
pair.as_rule()
|
pair.as_rule()
|
||||||
|
|||||||
+2
-8
@@ -1,9 +1,3 @@
|
|||||||
public struct Idk {
|
int test() {
|
||||||
int a,
|
int mut a = 10;
|
||||||
int b,
|
|
||||||
}
|
|
||||||
|
|
||||||
int test(int mut a, int b) {
|
|
||||||
Idk bro = Idk { a: 10, b: 10 };
|
|
||||||
return a + b + bro.a;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user