@@ -3,7 +3,8 @@ extern crate pest_derive;
3
3
4
4
use super :: * ;
5
5
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 } ;
7
8
use pest:: error:: Error ;
8
9
use pest:: iterators:: { Pair , Pairs } ;
9
10
use pest:: Parser ;
@@ -86,17 +87,62 @@ fn parse_method(pair: Pair<Rule>) -> MethodDecl {
86
87
ret_type,
87
88
name : method_name,
88
89
params,
89
- body,
90
+ body : Stmt :: Block ( body ) ,
90
91
}
91
92
}
92
93
_ => unreachable ! ( ) ,
93
94
}
94
95
}
95
96
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
+ }
97
141
todo ! ( )
98
142
}
99
143
144
+ //fn parse_variabledeclarators(pair: Pair<Rule>)->
145
+
100
146
fn parse_field ( pair : Pair < Rule > ) -> Vec < FieldDecl > {
101
147
match pair. as_rule ( ) {
102
148
Rule :: fielddeclaration => {
0 commit comments