Skip to content

Commit 20c3e34

Browse files
committed
#118 - Add support for yield statement
1 parent 5605563 commit 20c3e34

File tree

5 files changed

+51
-0
lines changed

5 files changed

+51
-0
lines changed

parser/base.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ void xx_parse_program(zval *return_value, char *program, size_t program_length,
178178
case XX_T_RETURN:
179179
xx_(xx_parser, XX_RETURN, NULL, parser_status);
180180
break;
181+
case XX_T_YIELD:
182+
xx_(xx_parser, XX_YIELD, NULL, parser_status);
183+
break;
181184
case XX_T_REQUIRE_ONCE:
182185
xx_(xx_parser, XX_REQUIRE_ONCE, NULL, parser_status);
183186
break;

parser/parser.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,28 @@ static void xx_ret_return_statement(zval *ret, zval *expr, xx_scanner_state *sta
899899
parser_add_int(ret, "char", state->active_char);
900900
}
901901

902+
static void xx_ret_yield_statement(zval *ret, zval *expr, zval *K, zval *V, xx_scanner_state *state)
903+
{
904+
array_init(ret);
905+
906+
parser_add_str(ret, "type", "yield");
907+
if (expr) {
908+
parser_add_zval(ret, "expr", expr);
909+
}
910+
911+
if (K) {
912+
parser_add_zval(ret, "key", K);
913+
}
914+
915+
if (V) {
916+
parser_add_zval(ret, "value", V);
917+
}
918+
919+
parser_add_str(ret, "file", state->active_file);
920+
parser_add_int(ret, "line", state->active_line);
921+
parser_add_int(ret, "char", state->active_char);
922+
}
923+
902924
static void xx_ret_require_once_statement(zval *ret, zval *expr, xx_scanner_state *state)
903925
{
904926
array_init(ret);

parser/scanner.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
#define XX_T_CATCH 398
100100
#define XX_T_DEPRECATED 399
101101
#define XX_T_REQUIRE_ONCE 459
102+
#define XX_T_YIELD 460
102103

103104
/* Operators */
104105
#define XX_T_AT '@'

parser/scanner.re

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,12 @@ int xx_get_token(xx_scanner_state *s, xx_scanner_token *token) {
363363
return 0;
364364
}
365365
366+
'yield' {
367+
s->active_char += sizeof("yield")-1;
368+
token->opcode = XX_T_YIELD;
369+
return 0;
370+
}
371+
366372
'require' {
367373
s->active_char += sizeof("require")-1;
368374
token->opcode = XX_T_REQUIRE;

parser/zephir.lemon

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,10 @@ xx_statement(R) ::= xx_return_statement(S) . {
986986
R = S;
987987
}
988988

989+
xx_statement(R) ::= xx_yield_statement(S) . {
990+
R = S;
991+
}
992+
989993
xx_statement(R) ::= xx_require_once_statement(S) . {
990994
R = S;
991995
}
@@ -1536,6 +1540,21 @@ xx_return_statement(R) ::= RETURN DOTCOMMA . {
15361540
xx_ret_return_statement(&R, NULL, status->scanner_state);
15371541
}
15381542

1543+
/* yield var; */
1544+
xx_yield_statement(R) ::= YIELD xx_common_expr(E) DOTCOMMA . {
1545+
xx_ret_yield_statement(&R, &E, NULL, NULL, status->scanner_state);
1546+
}
1547+
1548+
/* yield key, val; */
1549+
xx_yield_statement(R) ::= YIELD xx_common_expr(K) COMMA xx_common_expr(V) DOTCOMMA . {
1550+
xx_ret_yield_statement(&R, NULL, &K, &V, status->scanner_state);
1551+
}
1552+
1553+
/* yield; */
1554+
xx_yield_statement(R) ::= YIELD DOTCOMMA . {
1555+
xx_ret_yield_statement(&R, NULL, NULL, NULL, status->scanner_state);
1556+
}
1557+
15391558
/* require_once statement */
15401559
xx_require_once_statement(R) ::= REQUIRE_ONCE xx_common_expr(E) DOTCOMMA . {
15411560
xx_ret_require_once_statement(&R, &E, status->scanner_state);

0 commit comments

Comments
 (0)