@@ -53,6 +53,13 @@ class parser {
5353 return tokens[current + offset];
5454 }
5555
56+ const token & next () {
57+ if (current >= tokens.size ()) {
58+ throw parser_exception (" Parser Error: Unexpected EOF" , source, tokens.empty () ? 0 : tokens.back ().pos );
59+ }
60+ return tokens[current++];
61+ }
62+
5663 token expect (token::type type, const std::string& error) {
5764 const auto & t = peek ();
5865 if (t.t != type) {
@@ -90,9 +97,9 @@ class parser {
9097 size_t start_pos = current;
9198 switch (peek ().t ) {
9299 case token::comment:
93- return mk_stmt<comment_statement>(start_pos, tokens[current++] .value );
100+ return mk_stmt<comment_statement>(start_pos, next () .value );
94101 case token::text:
95- return mk_stmt<string_literal>(start_pos, tokens[current++] .value );
102+ return mk_stmt<string_literal>(start_pos, next () .value );
96103 case token::open_statement:
97104 return parse_jinja_statement ();
98105 case token::open_expression:
@@ -119,8 +126,7 @@ class parser {
119126 }
120127
121128 size_t start_pos = current;
122- std::string name = peek ().value ;
123- current++; // consume identifier
129+ std::string name = next ().value ;
124130
125131 statement_ptr result;
126132 if (name == " set" ) {
@@ -202,7 +208,7 @@ class parser {
202208 // Ignore generation blocks (transformers-specific)
203209 // See https://github.com/huggingface/transformers/pull/30650 for more information.
204210 result = mk_stmt<noop_statement>(start_pos);
205- current++ ;
211+ ++current ;
206212
207213 } else {
208214 throw std::runtime_error (" Unknown statement: " + name);
@@ -217,7 +223,7 @@ class parser {
217223 statements body;
218224
219225 if (is (token::equals)) {
220- current++ ;
226+ ++current ;
221227 value = parse_expression_sequence ();
222228 } else {
223229 // parsing multiline set here
@@ -280,7 +286,7 @@ class parser {
280286 exprs.push_back (primary ? parse_primary_expression () : parse_expression ());
281287 bool is_tuple = is (token::comma);
282288 while (is (token::comma)) {
283- current++ ; // consume comma
289+ ++current ; // consume comma
284290 exprs.push_back (primary ? parse_primary_expression () : parse_expression ());
285291 }
286292 return is_tuple ? mk_stmt<tuple_literal>(start_pos, std::move (exprs)) : std::move (exprs[0 ]);
@@ -290,7 +296,7 @@ class parser {
290296 // e.g., `message` in `for message in messages`
291297 auto loop_var = parse_expression_sequence (true ); // should be an identifier/tuple
292298 if (!is_identifier (" in" )) throw std::runtime_error (" Expected 'in'" );
293- current++;
299+ ++current; // consume 'in'
294300
295301 // `messages` in `for message in messages`
296302 auto iterable = parse_expression ();
@@ -305,7 +311,8 @@ class parser {
305311 }
306312
307313 if (is_statement ({" else" })) {
308- current += 2 ;
314+ ++current; // consume {%
315+ ++current; // consume 'else'
309316 expect (token::close_statement, " Expected %}" );
310317 while (!is_statement ({" endfor" })) {
311318 alternate.push_back (parse_any ());
@@ -347,7 +354,7 @@ class parser {
347354 auto left = parse_logical_and_expression ();
348355 while (is_identifier (" or" )) {
349356 size_t start_pos = current;
350- token op = tokens[current++] ;
357+ token op = next () ;
351358 left = mk_stmt<binary_expression>(start_pos, op, std::move (left), parse_logical_and_expression ());
352359 }
353360 return left;
@@ -357,7 +364,7 @@ class parser {
357364 auto left = parse_logical_negation_expression ();
358365 while (is_identifier (" and" )) {
359366 size_t start_pos = current;
360- auto op = tokens[current++] ;
367+ auto op = next () ;
361368 left = mk_stmt<binary_expression>(start_pos, op, std::move (left), parse_logical_negation_expression ());
362369 }
363370 return left;
@@ -367,7 +374,7 @@ class parser {
367374 // Try parse unary operators
368375 if (is_identifier (" not" )) {
369376 size_t start_pos = current;
370- auto op = tokens[current++] ;
377+ auto op = next () ;
371378 return mk_stmt<unary_expression>(start_pos, op, parse_logical_negation_expression ());
372379 }
373380 return parse_comparison_expression ();
@@ -382,11 +389,12 @@ class parser {
382389 size_t start_pos = current;
383390 if (is_identifier (" not" ) && peek (1 ).t == token::identifier && peek (1 ).value == " in" ) {
384391 op = {token::identifier, " not in" , tokens[current].pos };
385- current += 2 ;
392+ ++current; // consume 'not'
393+ ++current; // consume 'in'
386394 } else if (is_identifier (" in" )) {
387- op = tokens[current++] ;
395+ op = next () ;
388396 } else if (is (token::comparison_binary_operator)) {
389- op = tokens[current++] ;
397+ op = next () ;
390398 } else break ;
391399 left = mk_stmt<binary_expression>(start_pos, op, std::move (left), parse_additive_expression ());
392400 }
@@ -397,7 +405,7 @@ class parser {
397405 auto left = parse_multiplicative_expression ();
398406 while (is (token::additive_binary_operator)) {
399407 size_t start_pos = current;
400- auto op = tokens[current++] ;
408+ auto op = next () ;
401409 left = mk_stmt<binary_expression>(start_pos, op, std::move (left), parse_multiplicative_expression ());
402410 }
403411 return left;
@@ -407,7 +415,7 @@ class parser {
407415 auto left = parse_test_expression ();
408416 while (is (token::multiplicative_binary_operator)) {
409417 size_t start_pos = current;
410- auto op = tokens[current++] ;
418+ auto op = next () ;
411419 left = mk_stmt<binary_expression>(start_pos, op, std::move (left), parse_test_expression ());
412420 }
413421 return left;
@@ -417,9 +425,9 @@ class parser {
417425 auto operand = parse_filter_expression ();
418426 while (is_identifier (" is" )) {
419427 size_t start_pos = current;
420- current++;
428+ ++current; // consume 'is'
421429 bool negate = false ;
422- if (is_identifier (" not" )) { current++ ; negate = true ; }
430+ if (is_identifier (" not" )) { ++current ; negate = true ; }
423431 auto test_id = parse_primary_expression ();
424432 // FIXME: tests can also be expressed like this: if x is eq 3
425433 if (is (token::open_paren)) test_id = parse_call_expression (std::move (test_id));
@@ -432,7 +440,7 @@ class parser {
432440 auto operand = parse_call_member_expression ();
433441 while (is (token::pipe)) {
434442 size_t start_pos = current;
435- current++;
443+ ++current; // consume pipe
436444 auto filter = parse_primary_expression ();
437445 if (is (token::open_paren)) filter = parse_call_expression (std::move (filter));
438446 operand = mk_stmt<filter_expression>(start_pos, std::move (operand), std::move (filter));
@@ -490,7 +498,7 @@ class parser {
490498 statement_ptr parse_member_expression (statement_ptr object) {
491499 size_t start_pos = current;
492500 while (is (token::dot) || is (token::open_square_bracket)) {
493- auto op = tokens[current++] ;
501+ auto op = next () ;
494502 bool computed = op.t == token::open_square_bracket;
495503 statement_ptr prop;
496504 if (computed) {
@@ -536,7 +544,7 @@ class parser {
536544
537545 statement_ptr parse_primary_expression () {
538546 size_t start_pos = current;
539- auto t = tokens[current++] ;
547+ auto t = next () ;
540548 switch (t.t ) {
541549 case token::numeric_literal:
542550 if (t.value .find (' .' ) != std::string::npos) {
@@ -547,7 +555,7 @@ class parser {
547555 case token::string_literal: {
548556 std::string val = t.value ;
549557 while (is (token::string_literal)) {
550- val += tokens[current++] .value ;
558+ val += next () .value ;
551559 }
552560 return mk_stmt<string_literal>(start_pos, val);
553561 }
@@ -562,9 +570,9 @@ class parser {
562570 statements vals;
563571 while (!is (token::close_square_bracket)) {
564572 vals.push_back (parse_expression ());
565- if (is (token::comma)) current++ ;
573+ if (is (token::comma)) ++current ;
566574 }
567- current++ ;
575+ ++current ;
568576 return mk_stmt<array_literal>(start_pos, std::move (vals));
569577 }
570578 case token::open_curly_bracket: {
@@ -573,9 +581,9 @@ class parser {
573581 auto key = parse_expression ();
574582 expect (token::colon, " Expected :" );
575583 pairs.push_back ({std::move (key), parse_expression ()});
576- if (is (token::comma)) current++ ;
584+ if (is (token::comma)) ++current ;
577585 }
578- current++ ;
586+ ++current ;
579587 return mk_stmt<object_literal>(start_pos, std::move (pairs));
580588 }
581589 default :
0 commit comments