@@ -2,13 +2,11 @@ use rusty_pc::*;
22
33use crate :: core:: statements:: zero_or_more_statements;
44use crate :: error:: ParserError ;
5- use crate :: expr:: {
6- demand_expr_ws_keyword_p, opt_second_expression_after_keyword, property, ws_expr_pos_p
7- } ;
5+ use crate :: expr:: { demand_expr_ws_keyword_p, property, ws_expr_pos_p} ;
86use crate :: input:: StringView ;
97use crate :: pc_specific:: * ;
108use crate :: tokens:: equal_sign_ws;
11- use crate :: * ;
9+ use crate :: { ExpressionPos , ExpressionTrait , ForLoop , Keyword , Statement } ;
1210
1311// FOR I = 0 TO 5 STEP 1
1412// statements
@@ -44,10 +42,11 @@ fn parse_for_step_p() -> impl Parser<
4442 ) ,
4543 Error = ParserError ,
4644> {
47- opt_second_expression_after_keyword ( parse_for_p ( ) , Keyword :: Step , |( _var, _low, upper) | {
48- upper. is_parenthesis ( )
49- } )
50- . map ( |( ( n, l, u) , opt_step) | ( n, l, u, opt_step) )
45+ parse_for_p ( ) . then_with_in_context (
46+ opt_step_p ( ) ,
47+ |( _, _, upper) | upper. is_parenthesis ( ) ,
48+ |( n, l, u) , opt_step| ( n, l, u, opt_step) ,
49+ )
5150}
5251
5352/// Parses the "FOR I = 1 TO 2" part
@@ -68,6 +67,18 @@ fn next_counter_p() -> impl Parser<StringView, Output = ExpressionPos, Error = P
6867 lead_ws ( property:: parser ( ) )
6968}
7069
70+ fn opt_step_p ( ) -> impl Parser < StringView , bool , Output = Option < ExpressionPos > , Error = ParserError >
71+ {
72+ conditionally_opt_whitespace ( )
73+ . and_keep_right ( keyword_ignoring ( Keyword :: Step ) . no_context ( ) )
74+ . and_keep_right (
75+ ws_expr_pos_p ( )
76+ . or_expected ( "expression after STEP" )
77+ . no_context ( ) ,
78+ )
79+ . to_option ( )
80+ }
81+
7182#[ cfg( test) ]
7283mod tests {
7384 use rusty_common:: * ;
0 commit comments