summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/awk.c60
1 files changed, 33 insertions, 27 deletions
diff --git a/editors/awk.c b/editors/awk.c
index 96e06db..a1a2afd 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -211,8 +211,8 @@ typedef struct tsplitter_s {
#define TC_PIPE (1 << 9) /* input redirection pipe | */
#define TC_UOPPRE2 (1 << 10) /* unary prefix operator + - ! */
#define TC_ARRTERM (1 << 11) /* ] */
-#define TC_GRPSTART (1 << 12) /* { */
-#define TC_GRPTERM (1 << 13) /* } */
+#define TC_LBRACE (1 << 12) /* { */
+#define TC_RBRACE (1 << 13) /* } */
#define TC_SEMICOL (1 << 14) /* ; */
#define TC_NEWLINE (1 << 15)
#define TC_STATX (1 << 16) /* ctl statement (for, next...) */
@@ -250,8 +250,8 @@ if ((n) & TC_COMMA ) debug_printf_parse(" COMMA" ); \
if ((n) & TC_PIPE ) debug_printf_parse(" PIPE" ); \
if ((n) & TC_UOPPRE2 ) debug_printf_parse(" UOPPRE2" ); \
if ((n) & TC_ARRTERM ) debug_printf_parse(" ARRTERM" ); \
-if ((n) & TC_GRPSTART) debug_printf_parse(" GRPSTART"); \
-if ((n) & TC_GRPTERM ) debug_printf_parse(" GRPTERM" ); \
+if ((n) & TC_LBRACE ) debug_printf_parse(" LBRACE" ); \
+if ((n) & TC_RBRACE ) debug_printf_parse(" RBRACE" ); \
if ((n) & TC_SEMICOL ) debug_printf_parse(" SEMICOL" ); \
if ((n) & TC_NEWLINE ) debug_printf_parse(" NEWLINE" ); \
if ((n) & TC_STATX ) debug_printf_parse(" STATX" ); \
@@ -291,13 +291,13 @@ if ((n) & TC_NUMBER ) debug_printf_parse(" NUMBER" ); \
| TC_FUNCDECL | TC_BEGIN | TC_END)
/* discard newlines after these */
-#define TS_NOTERM (TC_COMMA | TC_GRPSTART | TC_GRPTERM \
+#define TS_NOTERM (TC_COMMA | TC_LBRACE | TC_RBRACE \
| TS_BINOP | TS_OPTERM)
/* what can expression begin with */
#define TS_OPSEQ (TS_OPERAND | TS_UOPPRE | TC_REGEXP)
/* what can group begin with */
-#define TS_GRPSEQ (TS_OPSEQ | TS_OPTERM | TS_STATEMNT | TC_GRPSTART)
+#define TS_GRPSEQ (TS_OPSEQ | TS_OPTERM | TS_STATEMNT | TC_LBRACE)
/* if previous token class is CONCAT_L and next is CONCAT_R, concatenation */
/* operator is inserted between them */
@@ -402,8 +402,8 @@ static const char tokenlist[] ALIGN1 =
"\1|" NTC /* TC_PIPE */
"\1+" "\1-" "\1!" NTC /* TC_UOPPRE2 */
"\1]" NTC /* TC_ARRTERM */
- "\1{" NTC /* TC_GRPSTART */
- "\1}" NTC /* TC_GRPTERM */
+ "\1{" NTC /* TC_LBRACE */
+ "\1}" NTC /* TC_RBRACE */
"\1;" NTC /* TC_SEMICOL */
"\1\n" NTC /* TC_NEWLINE */
"\2if" "\2do" "\3for" "\5break" /* TC_STATX */
@@ -1471,7 +1471,7 @@ static node *parse_expr(uint32_t term_tc)
debug_printf_parse("%s: TC_LENGTH\n", __func__);
tc = next_token(TC_LPAREN /* length(...) */
| TS_OPTERM /* length; (or newline)*/
- | TC_GRPTERM /* length } */
+ | TC_RBRACE /* length } */
| TC_BINOPX /* length <op> NUM */
| TC_COMMA /* print length, 1 */
);
@@ -1516,11 +1516,11 @@ static void chain_expr(uint32_t info)
n = chain_node(info);
- n->l.n = parse_expr(TS_OPTERM | TC_GRPTERM);
+ n->l.n = parse_expr(TS_OPTERM | TC_RBRACE);
if ((info & OF_REQUIRED) && !n->l.n)
syntax_error(EMSG_TOO_FEW_ARGS);
- if (t_tclass & TC_GRPTERM)
+ if (t_tclass & TC_RBRACE)
rollback_token();
}
@@ -1559,16 +1559,16 @@ static void chain_group(void)
c = next_token(TS_GRPSEQ);
} while (c & TC_NEWLINE);
- if (c & TC_GRPSTART) {
- debug_printf_parse("%s: TC_GRPSTART\n", __func__);
- while ((c = next_token(TS_GRPSEQ | TC_GRPTERM)) != TC_GRPTERM) {
- debug_printf_parse("%s: !TC_GRPTERM\n", __func__);
+ if (c & TC_LBRACE) {
+ debug_printf_parse("%s: TC_LBRACE\n", __func__);
+ while ((c = next_token(TS_GRPSEQ | TC_RBRACE)) != TC_RBRACE) {
+ debug_printf_parse("%s: !TC_RBRACE\n", __func__);
if (c & TC_NEWLINE)
continue;
rollback_token();
chain_group();
}
- debug_printf_parse("%s: TC_GRPTERM\n", __func__);
+ debug_printf_parse("%s: TC_RBRACE\n", __func__);
return;
}
if (c & (TS_OPSEQ | TS_OPTERM)) {
@@ -1588,7 +1588,7 @@ static void chain_group(void)
chain_group();
n2 = chain_node(OC_EXEC);
n->r.n = seq->last;
- if (next_token(TS_GRPSEQ | TC_GRPTERM | TC_ELSE) == TC_ELSE) {
+ if (next_token(TS_GRPSEQ | TC_RBRACE | TC_ELSE) == TC_ELSE) {
chain_group();
n2->a.n = seq->last;
} else {
@@ -1641,12 +1641,12 @@ static void chain_group(void)
case OC_PRINTF:
debug_printf_parse("%s: OC_PRINT[F]\n", __func__);
n = chain_node(t_info);
- n->l.n = parse_expr(TS_OPTERM | TC_OUTRDR | TC_GRPTERM);
+ n->l.n = parse_expr(TS_OPTERM | TC_OUTRDR | TC_RBRACE);
if (t_tclass & TC_OUTRDR) {
n->info |= t_info;
- n->r.n = parse_expr(TS_OPTERM | TC_GRPTERM);
+ n->r.n = parse_expr(TS_OPTERM | TC_RBRACE);
}
- if (t_tclass & TC_GRPTERM)
+ if (t_tclass & TC_RBRACE)
rollback_token();
break;
@@ -1684,7 +1684,7 @@ static void parse_program(char *p)
g_pos = p;
t_lineno = 1;
- while ((tclass = next_token(TC_EOF | TS_OPSEQ | TC_GRPSTART |
+ while ((tclass = next_token(TC_EOF | TS_OPSEQ | TC_LBRACE |
TS_OPTERM | TC_BEGIN | TC_END | TC_FUNCDECL)) != TC_EOF) {
if (tclass & TS_OPTERM) {
@@ -1696,10 +1696,14 @@ static void parse_program(char *p)
if (tclass & TC_BEGIN) {
debug_printf_parse("%s: TC_BEGIN\n", __func__);
seq = &beginseq;
+//TODO: ensure there is no newline between BEGIN and {
+//next_token(TC_LBRACE); rollback_token();
chain_group();
} else if (tclass & TC_END) {
debug_printf_parse("%s: TC_END\n", __func__);
seq = &endseq;
+//TODO: ensure there is no newline between END and {
+//next_token(TC_LBRACE); rollback_token();
chain_group();
} else if (tclass & TC_FUNCDECL) {
debug_printf_parse("%s: TC_FUNCDECL\n", __func__);
@@ -1726,24 +1730,26 @@ static void parse_program(char *p)
/* it was a comma, we ate it */
}
seq = &f->body;
+//TODO: ensure there is { after "func F(...)" - but newlines are allowed
+//while (next_token(TC_LBRACE | TC_NEWLINE) == TC_NEWLINE) continue; rollback_token();
chain_group();
hash_clear(ahash);
} else if (tclass & TS_OPSEQ) {
debug_printf_parse("%s: TS_OPSEQ\n", __func__);
rollback_token();
cn = chain_node(OC_TEST);
- cn->l.n = parse_expr(TS_OPTERM | TC_EOF | TC_GRPSTART);
- if (t_tclass & TC_GRPSTART) {
- debug_printf_parse("%s: TC_GRPSTART\n", __func__);
+ cn->l.n = parse_expr(TS_OPTERM | TC_EOF | TC_LBRACE);
+ if (t_tclass & TC_LBRACE) {
+ debug_printf_parse("%s: TC_LBRACE\n", __func__);
rollback_token();
chain_group();
} else {
- debug_printf_parse("%s: !TC_GRPSTART\n", __func__);
+ debug_printf_parse("%s: !TC_LBRACE\n", __func__);
chain_node(OC_PRINT);
}
cn->r.n = mainseq.last;
- } else /* if (tclass & TC_GRPSTART) */ {
- debug_printf_parse("%s: TC_GRPSTART(?)\n", __func__);
+ } else /* if (tclass & TC_LBRACE) */ {
+ debug_printf_parse("%s: TC_LBRACE(?)\n", __func__);
rollback_token();
chain_group();
}