@@ -2,16 +2,25 @@ use nom::{
22 branch:: alt,
33 bytes:: complete:: tag,
44 character:: complete:: { char, multispace0, multispace1} ,
5- combinator:: { map, map_res , opt, value , verify } ,
5+ combinator:: { map, opt} ,
66 error:: Error ,
7- multi:: { fold_many0 , separated_list0} ,
8- sequence:: { delimited, pair , preceded, tuple} ,
7+ multi:: separated_list0,
8+ sequence:: { delimited, preceded, tuple} ,
99 IResult ,
1010} ;
1111
12- use crate :: ir:: ast:: { Expression , FormalArgument , Function , Statement , Type } ;
13- use crate :: parser:: parser_common:: { identifier, keyword} ;
14- use crate :: parser:: parser_expr:: { parse_actual_arguments, parse_expression} ;
12+ use crate :: ir:: ast:: { FormalArgument , Function , Statement } ;
13+ use crate :: parser:: parser_common:: {
14+ identifier, keyword,
15+ // Statement keyword constants
16+ IF_KEYWORD , ELSE_KEYWORD , WHILE_KEYWORD , FOR_KEYWORD , IN_KEYWORD ,
17+ ASSERT_KEYWORD , DEF_KEYWORD , END_KEYWORD ,
18+ // Operator and symbol constants
19+ FUNCTION_ARROW ,
20+ // Character constants
21+ LEFT_PAREN , RIGHT_PAREN , COLON_CHAR , SEMICOLON_CHAR , COMMA_CHAR , EQUALS_CHAR ,
22+ } ;
23+ use crate :: parser:: parser_expr:: parse_expression;
1524use crate :: parser:: parser_type:: parse_type;
1625
1726pub fn parse_statement ( input : & str ) -> IResult < & str , Statement > {
@@ -29,7 +38,7 @@ fn parse_assignment_statement(input: &str) -> IResult<&str, Statement> {
2938 map (
3039 tuple ( (
3140 delimited ( multispace0, identifier, multispace0) ,
32- char:: <& str, Error <& str>>( '=' ) ,
41+ char:: <& str, Error <& str>>( EQUALS_CHAR ) ,
3342 delimited ( multispace0, parse_expression, multispace0) ,
3443 ) ) ,
3544 |( var, _, expr) | Statement :: Assignment ( var. to_string ( ) , Box :: new ( expr) ) ,
@@ -39,10 +48,10 @@ fn parse_assignment_statement(input: &str) -> IResult<&str, Statement> {
3948fn parse_if_else_statement ( input : & str ) -> IResult < & str , Statement > {
4049 map (
4150 tuple ( (
42- keyword ( "if" ) ,
51+ keyword ( IF_KEYWORD ) ,
4352 preceded ( multispace1, parse_expression) ,
4453 parse_block,
45- opt ( preceded ( tuple ( ( multispace0, keyword ( "else" ) ) ) , parse_block) ) ,
54+ opt ( preceded ( tuple ( ( multispace0, keyword ( ELSE_KEYWORD ) ) ) , parse_block) ) ,
4655 ) ) ,
4756 |( _, cond, then_block, else_block) | {
4857 Statement :: IfThenElse (
@@ -57,7 +66,7 @@ fn parse_if_else_statement(input: &str) -> IResult<&str, Statement> {
5766fn parse_while_statement ( input : & str ) -> IResult < & str , Statement > {
5867 map (
5968 tuple ( (
60- keyword ( "while" ) ,
69+ keyword ( WHILE_KEYWORD ) ,
6170 preceded ( multispace1, parse_expression) ,
6271 parse_block,
6372 ) ) ,
@@ -68,9 +77,9 @@ fn parse_while_statement(input: &str) -> IResult<&str, Statement> {
6877fn parse_for_statement ( input : & str ) -> IResult < & str , Statement > {
6978 map (
7079 tuple ( (
71- keyword ( "for" ) ,
80+ keyword ( FOR_KEYWORD ) ,
7281 preceded ( multispace1, identifier) ,
73- preceded ( multispace0, keyword ( "in" ) ) ,
82+ preceded ( multispace0, keyword ( IN_KEYWORD ) ) ,
7483 preceded ( multispace1, parse_expression) ,
7584 parse_block,
7685 ) ) ,
@@ -81,14 +90,14 @@ fn parse_for_statement(input: &str) -> IResult<&str, Statement> {
8190fn parse_assert_statement ( input : & str ) -> IResult < & str , Statement > {
8291 map (
8392 tuple ( (
84- keyword ( "assert" ) ,
93+ keyword ( ASSERT_KEYWORD ) ,
8594 delimited (
86- char:: <& str, Error <& str>>( '(' ) ,
95+ char:: <& str, Error <& str>>( LEFT_PAREN ) ,
8796 separated_list0 (
88- tuple ( ( multispace0, char:: <& str, Error <& str>>( ',' ) , multispace0) ) ,
97+ tuple ( ( multispace0, char:: <& str, Error <& str>>( COMMA_CHAR ) , multispace0) ) ,
8998 parse_expression,
9099 ) ,
91- char:: <& str, Error <& str>>( ')' ) ,
100+ char:: <& str, Error <& str>>( RIGHT_PAREN ) ,
92101 ) ,
93102 ) ) ,
94103 |( _, args) | {
@@ -103,17 +112,17 @@ fn parse_assert_statement(input: &str) -> IResult<&str, Statement> {
103112fn parse_function_definition_statement ( input : & str ) -> IResult < & str , Statement > {
104113 map (
105114 tuple ( (
106- keyword ( "def" ) ,
115+ keyword ( DEF_KEYWORD ) ,
107116 preceded ( multispace1, identifier) ,
108117 delimited (
109- char:: <& str, Error <& str>>( '(' ) ,
118+ char:: <& str, Error <& str>>( LEFT_PAREN ) ,
110119 separated_list0 (
111- tuple ( ( multispace0, char:: <& str, Error <& str>>( ',' ) , multispace0) ) ,
120+ tuple ( ( multispace0, char:: <& str, Error <& str>>( COMMA_CHAR ) , multispace0) ) ,
112121 parse_formal_argument,
113122 ) ,
114- char:: <& str, Error <& str>>( ')' ) ,
123+ char:: <& str, Error <& str>>( RIGHT_PAREN ) ,
115124 ) ,
116- preceded ( multispace0, tag ( "->" ) ) ,
125+ preceded ( multispace0, tag ( FUNCTION_ARROW ) ) ,
117126 preceded ( multispace0, parse_type) ,
118127 parse_block,
119128 ) ) ,
@@ -131,14 +140,14 @@ fn parse_function_definition_statement(input: &str) -> IResult<&str, Statement>
131140fn parse_block ( input : & str ) -> IResult < & str , Statement > {
132141 map (
133142 tuple ( (
134- char:: <& str, Error <& str>>( ':' ) ,
143+ char:: <& str, Error <& str>>( COLON_CHAR ) ,
135144 multispace0,
136145 separated_list0 (
137- delimited ( multispace0, char:: <& str, Error <& str>>( ';' ) , multispace0) ,
146+ delimited ( multispace0, char:: <& str, Error <& str>>( SEMICOLON_CHAR ) , multispace0) ,
138147 parse_statement,
139148 ) ,
140- opt ( preceded ( multispace0, char:: <& str, Error <& str>>( ';' ) ) ) ,
141- delimited ( multispace0, keyword ( "end" ) , multispace0) ,
149+ opt ( preceded ( multispace0, char:: <& str, Error <& str>>( SEMICOLON_CHAR ) ) ) ,
150+ delimited ( multispace0, keyword ( END_KEYWORD ) , multispace0) ,
142151 ) ) ,
143152 |( _, _, stmts, _, _) | Statement :: Block ( stmts) ,
144153 ) ( input)
@@ -148,7 +157,7 @@ fn parse_formal_argument(input: &str) -> IResult<&str, FormalArgument> {
148157 map (
149158 tuple ( (
150159 preceded ( multispace0, identifier) ,
151- preceded ( multispace0, char:: <& str, Error <& str>>( ':' ) ) ,
160+ preceded ( multispace0, char:: <& str, Error <& str>>( COLON_CHAR ) ) ,
152161 preceded ( multispace0, parse_type) ,
153162 ) ) ,
154163 |( name, _, t) | FormalArgument :: new ( name. to_string ( ) , t) ,
0 commit comments