Skip to content

Commit 40e0715

Browse files
committed
Added demand_ws_expr_ws_keyword_p and ws_expr_ws_keyword_p
1 parent 1ad502f commit 40e0715

5 files changed

Lines changed: 41 additions & 26 deletions

File tree

rusty_parser/src/built_ins/name.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
use rusty_pc::*;
22

3-
use crate::expr::{ws_expr_pos_p, ws_expr_pos_ws_p};
3+
use crate::expr::{demand_ws_expr_ws_keyword_p, ws_expr_pos_p};
44
use crate::input::StringView;
55
use crate::pc_specific::*;
66
use crate::{BuiltInSub, ParserError, *};
77

88
pub fn parse() -> impl Parser<StringView, Output = Statement, Error = ParserError> {
9-
seq4(
9+
seq3(
1010
keyword(Keyword::Name),
11-
ws_expr_pos_ws_p().or_expected("old file name"),
12-
keyword(Keyword::As),
11+
demand_ws_expr_ws_keyword_p("old file name", Keyword::As),
1312
ws_expr_pos_p().or_expected("new file name"),
14-
|_, l, _, r| Statement::built_in_sub_call(BuiltInSub::Name, vec![l, r]),
13+
|_, l, r| Statement::built_in_sub_call(BuiltInSub::Name, vec![l, r]),
1514
)
1615
}

rusty_parser/src/built_ins/view_print.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
use rusty_pc::and::VecCombiner;
12
use rusty_pc::*;
23

3-
use crate::expr::{ws_expr_pos_p, ws_expr_pos_ws_p};
4+
use crate::expr::{ws_expr_pos_p, ws_expr_ws_keyword_p};
45
use crate::input::StringView;
56
use crate::pc_specific::*;
67
use crate::{BuiltInSub, ParserError, *};
@@ -12,12 +13,7 @@ pub fn parse() -> impl Parser<StringView, Output = Statement, Error = ParserErro
1213
}
1314

1415
fn parse_args() -> impl Parser<StringView, Output = Expressions, Error = ParserError> {
15-
seq3(
16-
ws_expr_pos_ws_p(),
17-
keyword(Keyword::To),
18-
ws_expr_pos_p().or_expected("expression"),
19-
|l, _, r| vec![l, r],
20-
)
16+
ws_expr_ws_keyword_p(Keyword::To).and(ws_expr_pos_p().or_expected("expression"), VecCombiner)
2117
}
2218

2319
#[cfg(test)]

rusty_parser/src/core/if_block.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::core::single_line_statements::{
55
single_line_non_comment_statements_p, single_line_statements_p
66
};
77
use crate::core::statements::zero_or_more_statements;
8-
use crate::expr::ws_expr_pos_ws_p;
8+
use crate::expr::demand_ws_expr_ws_keyword_p;
99
use crate::input::StringView;
1010
use crate::pc_specific::*;
1111
use crate::{ParserError, *};
@@ -35,12 +35,10 @@ pub fn if_block_p() -> impl Parser<StringView, Output = Statement, Error = Parse
3535
// multi line if ::= statements else-if-blocks else-block END IF
3636

3737
fn if_expr_then_p() -> impl Parser<StringView, Output = ExpressionPos, Error = ParserError> {
38-
seq3(
39-
keyword(Keyword::If),
40-
ws_expr_pos_ws_p().or_expected("expression after IF"),
41-
keyword(Keyword::Then),
42-
|_, m, _| m,
43-
)
38+
keyword(Keyword::If).and_keep_right(demand_ws_expr_ws_keyword_p(
39+
"expression after IF",
40+
Keyword::Then,
41+
))
4442
}
4543

4644
fn single_line_if_else_p() -> impl Parser<
@@ -79,12 +77,10 @@ fn multi_line_if_p() -> impl Parser<
7977
}
8078

8179
fn else_if_expr_then_p() -> impl Parser<StringView, Output = ExpressionPos, Error = ParserError> {
82-
seq3(
83-
keyword(Keyword::ElseIf),
84-
ws_expr_pos_ws_p().or_expected("expression after ELSEIF"),
85-
keyword(Keyword::Then),
86-
|_, m, _| m,
87-
)
80+
keyword(Keyword::ElseIf).and_keep_right(demand_ws_expr_ws_keyword_p(
81+
"expression after ELSEIF",
82+
Keyword::Then,
83+
))
8884
}
8985

9086
fn else_if_block_p() -> impl Parser<StringView, Output = ConditionalBlock, Error = ParserError> {

rusty_parser/src/expr/parsers.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,22 @@ pub fn demand_expr_ws_keyword_p(
105105
)
106106
}
107107

108+
pub fn ws_expr_ws_keyword_p(
109+
keyword: Keyword,
110+
) -> impl Parser<StringView, Output = ExpressionPos, Error = ParserError> {
111+
expr_ws_followed_by(ws_expr_pos_p(), keyword_ignoring(keyword))
112+
}
113+
114+
pub fn demand_ws_expr_ws_keyword_p(
115+
expectation: &str,
116+
keyword: Keyword,
117+
) -> impl Parser<StringView, Output = ExpressionPos, Error = ParserError> {
118+
expr_ws_followed_by(
119+
ws_expr_pos_p().or_expected(expectation),
120+
keyword_ignoring(keyword),
121+
)
122+
}
123+
108124
/// Parses the expression using the given parser,
109125
/// then demands whitespace, unless the expression is a parenthesis.
110126
/// Finally it demands the second parser.

rusty_pc/src/and.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,17 @@ where
103103
}
104104
}
105105

106-
/// Combines two vectors by concatenating them into one.
106+
/// Combines items into a vector.
107107
pub struct VecCombiner;
108108

109+
/// Combines two items into a vector.
110+
impl<L> Combiner<L, L, Vec<L>> for VecCombiner {
111+
fn combine(&self, left: L, right: L) -> Vec<L> {
112+
vec![left, right]
113+
}
114+
}
115+
116+
/// Combines two vectors by concatenating them into one.
109117
impl<L> Combiner<Vec<L>, Vec<L>, Vec<L>> for VecCombiner {
110118
fn combine(&self, mut left: Vec<L>, mut right: Vec<L>) -> Vec<L> {
111119
left.append(&mut right);

0 commit comments

Comments
 (0)