Skip to content

Commit f7a334d

Browse files
implented parsing parse_Stmt <[email protected]>
Signed-off-by: sander <[email protected]>
1 parent ac4c7c4 commit f7a334d

File tree

3 files changed

+56
-9
lines changed

3 files changed

+56
-9
lines changed

lib/src/parser/JavaGrammar.pest

+6-5
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,11 @@ variabledeclarators ={ variabledeclarator~(","~variabledeclarator)* }
3838
variabledeclarator ={ IDENTIFIER
3939
| IDENTIFIER~"="~expression }
4040

41-
42-
blockstatement ={ localvariabledeclarationstatement
41+
// implemented
42+
blockstatement ={ typeJ~variabledeclarators~";"
4343
| statement }
44+
45+
4446
//implemented
4547
formalparameterlist = {formalparameter~(","~formalparameter)*}
4648
//implemented
@@ -63,14 +65,13 @@ primitivetype = {"boolean"
6365
argumentlist = {expression~(","~expression)*}
6466

6567

66-
localvariabledeclarationstatement = {localvariabledeclaration~";" }
6768

68-
statement = {statementwithouttrailingsubstatement
69+
70+
statement = {statementwithouttrailingsubstatement
6971
| ifthenstatement
7072
| ifthenelsestatement
7173
| whilestatement }
7274

73-
localvariabledeclaration ={ typeJ~variabledeclarators }
7475

7576
statementwithouttrailingsubstatement = {block
7677
| emptystatement

lib/src/parser/parser.rs

+49-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ extern crate pest_derive;
33

44
use super::*;
55
use crate::parser::Rule::name;
6-
use crate::types::{Class, Expr, FieldDecl, MethodDecl, Stmt, Type};
6+
use crate::types::Stmt::{Block, StmtExprStmt};
7+
use crate::types::{Class, Expr, FieldDecl, MethodDecl, Stmt, StmtExpr, Type};
78
use pest::error::Error;
89
use pest::iterators::{Pair, Pairs};
910
use pest::Parser;
@@ -86,17 +87,62 @@ fn parse_method(pair: Pair<Rule>) -> MethodDecl {
8687
ret_type,
8788
name: method_name,
8889
params,
89-
body,
90+
body: Stmt::Block(body),
9091
}
9192
}
9293
_ => unreachable!(),
9394
}
9495
}
9596

96-
fn parse_Stmt(pair: Pair<Rule>) -> Stmt {
97+
fn parse_Stmt(pair: Pair<Rule>) -> Vec<Stmt> {
98+
match pair.as_rule() {
99+
Rule::blockstatement => {
100+
let mut inner = pair.into_inner();
101+
let first = inner.next().unwrap();
102+
match first.as_rule() {
103+
Rule::typeJ => {
104+
let typeJ = parse_Type(first);
105+
let varDecels = inner.next().unwrap().into_inner();
106+
varDecels
107+
.map(|x| {
108+
let mut inner = x.into_inner();
109+
let other_name = next_id(&mut inner);
110+
match inner.next() {
111+
None => vec![Stmt::LocalVarDecl(typeJ.clone(), other_name)],
112+
Some(expresion) => vec![
113+
Stmt::LocalVarDecl(typeJ.clone(), other_name.clone()),
114+
Stmt::StmtExprStmt(StmtExpr::Assign(
115+
other_name,
116+
parse_expr(expresion),
117+
)),
118+
],
119+
}
120+
})
121+
.flatten()
122+
.collect()
123+
}
124+
Rule::statement => {
125+
vec![]
126+
}
127+
_ => unreachable!(),
128+
}
129+
}
130+
_ => unreachable!(),
131+
}
132+
}
133+
fn parse_statement(pair: Pair<Rule>) -> Stmt {
134+
match pair.as_rule() {
135+
Rule::statementwithouttrailingsubstatement => {}
136+
Rule::ifthenstatement => {}
137+
Rule::ifthenelsestatement => {}
138+
Rule::whilestatement => {}
139+
_ => unreachable!(),
140+
}
97141
todo!()
98142
}
99143

144+
//fn parse_variabledeclarators(pair: Pair<Rule>)->
145+
100146
fn parse_field(pair: Pair<Rule>) -> Vec<FieldDecl> {
101147
match pair.as_rule() {
102148
Rule::fielddeclaration => {

src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ fn main() -> color_eyre::Result<()> {
3030
FieldDecl {
3131
field_type: Type::Int,
3232
name: "d".to_string(),
33-
val: Some("42".to_string()),
33+
val: Some(Expr::Integer(42)),
3434
},
3535
],
3636
methods: vec![MethodDecl {

0 commit comments

Comments
 (0)