aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-10-21 13:28:25 -0700
committerNicholas Noll <nbnoll@eml.cc>2021-10-21 13:28:25 -0700
commitda77d3be2eb0785bc0c0b60c686e163d6243c744 (patch)
tree75f15d89c1517bf0ba82128753fd0f6c4d3d2447
parent65193a54609c558e473118dba323edc001bdb585 (diff)
feat(rc): added andand and oror operators
-rw-r--r--sys/cmd/rc/code.c89
-rw-r--r--sys/cmd/rc/exec.c18
-rw-r--r--sys/cmd/rc/exec.h2
-rw-r--r--sys/cmd/rc/lex.c4
-rw-r--r--sys/cmd/rc/parse.c454
-rw-r--r--sys/cmd/rc/parse.h82
-rw-r--r--sys/cmd/rc/prompt.c3
-rw-r--r--sys/cmd/rc/syntax.y18
8 files changed, 375 insertions, 295 deletions
diff --git a/sys/cmd/rc/code.c b/sys/cmd/rc/code.c
index 46873ef..bcc3d38 100644
--- a/sys/cmd/rc/code.c
+++ b/sys/cmd/rc/code.c
@@ -85,35 +85,35 @@ walk(Tree *node)
emitf(Xconcatenate);
break;
- case Targs:
- walk(node->child[1]);
+ case Tandand:
walk(node->child[0]);
+ emitf(Xtrue);
+ addr1 = emiti(0);
+ walk(node->child[1]);
+ storepc(addr1);
break;
- case Tparen: case Tblock:
+ case Toror:
walk(node->child[0]);
+ emitf(Xfalse);
+ addr1 = emiti(0);
+ walk(node->child[1]);
+ storepc(addr1);
break;
- case Tbasic:
- emitf(Xmark);
+ case Targs:
+ walk(node->child[1]);
walk(node->child[0]);
- emitf(Xbasic);
break;
- case '&':
- emitf(Xasync);
- addr1 = emiti(0);
+ case Tparen: case Tblock:
walk(node->child[0]);
- emitf(Xexit);
- storepc(addr1);
break;
- case Tsubshell:
- emitf(Xsubshell);
- addr1 = emiti(0);
+ case Tbasic:
+ emitf(Xmark);
walk(node->child[0]);
- emitf(Xexit);
- storepc(addr1);
+ emitf(Xbasic);
break;
case Tbang:
@@ -130,26 +130,6 @@ walk(Tree *node)
walk(node->child[0]);
break;
- case Tpipe:
- emitf(Xpipe);
-
- emiti(node->redir.fd[0]);
- emiti(node->redir.fd[1]);
- addr1 = emiti(0);
- addr2 = emiti(0);
-
- walk(node->child[0]);
- emitf(Xexit);
- storepc(addr1);
-
- walk(node->child[1]);
- emitf(Xreturn);
- storepc(addr2);
-
- emitf(Xpipewait);
-
- break;
-
case '=':
for(n=node; node && node->type == '='; node = node->child[2])
;
@@ -175,6 +155,43 @@ walk(Tree *node)
}
node = n;
break;
+
+ /* forks */
+ case '&':
+ emitf(Xasync);
+ addr1 = emiti(0);
+ walk(node->child[0]);
+ emitf(Xexit);
+ storepc(addr1);
+ break;
+
+ case Tsubshell:
+ emitf(Xsubshell);
+ addr1 = emiti(0);
+ walk(node->child[0]);
+ emitf(Xexit);
+ storepc(addr1);
+ break;
+
+ case Tpipe:
+ emitf(Xpipe);
+
+ emiti(node->redir.fd[0]);
+ emiti(node->redir.fd[1]);
+ addr1 = emiti(0);
+ addr2 = emiti(0);
+
+ walk(node->child[0]);
+ emitf(Xexit);
+ storepc(addr1);
+
+ walk(node->child[1]);
+ emitf(Xreturn);
+ storepc(addr2);
+
+ emitf(Xpipewait);
+
+ break;
}
}
diff --git a/sys/cmd/rc/exec.c b/sys/cmd/rc/exec.c
index 425d00f..68d366a 100644
--- a/sys/cmd/rc/exec.c
+++ b/sys/cmd/rc/exec.c
@@ -578,6 +578,24 @@ Xword(void)
pushword(runner->code.exe[runner->code.i++].s);
}
+void
+Xtrue(void)
+{
+ if(!runner->status)
+ runner->code.i++;
+ else
+ runner->code.i = runner->code.exe[runner->code.i].i;
+}
+
+void
+Xfalse(void)
+{
+ if(runner->status)
+ runner->code.i++;
+ else
+ runner->code.i = runner->code.exe[runner->code.i].i;
+}
+
static
Word*
catlist(Word *l, Word *r, Word *tail)
diff --git a/sys/cmd/rc/exec.h b/sys/cmd/rc/exec.h
index 4bf2a4b..652edea 100644
--- a/sys/cmd/rc/exec.h
+++ b/sys/cmd/rc/exec.h
@@ -7,6 +7,8 @@
* Code in line with jump around {...}
*/
+void Xtrue(void);
+void Xfalse(void);
void Xdollar(void);
void Xexit(void);
void Xmark(void);
diff --git a/sys/cmd/rc/lex.c b/sys/cmd/rc/lex.c
index 5de238e..6065981 100644
--- a/sys/cmd/rc/lex.c
+++ b/sys/cmd/rc/lex.c
@@ -242,6 +242,10 @@ yylex(void)
case '&':
lexer.haddollar = 0;
+ if(nextis('&')){
+ put2('&','&');
+ return Tandand;
+ }
put1('&');
return '&';
diff --git a/sys/cmd/rc/parse.c b/sys/cmd/rc/parse.c
index d1909a5..774e8d4 100644
--- a/sys/cmd/rc/parse.c
+++ b/sys/cmd/rc/parse.c
@@ -105,57 +105,61 @@ enum yysymbol_kind_t
YYSYMBOL_YYEOF = 0, /* "end of file" */
YYSYMBOL_YYerror = 1, /* error */
YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
- YYSYMBOL_Tword = 3, /* Tword */
- YYSYMBOL_Twords = 4, /* Twords */
- YYSYMBOL_Tif = 5, /* Tif */
- YYSYMBOL_Telse = 6, /* Telse */
- YYSYMBOL_Tbang = 7, /* Tbang */
- YYSYMBOL_Tsubshell = 8, /* Tsubshell */
- YYSYMBOL_Toror = 9, /* Toror */
- YYSYMBOL_Tandand = 10, /* Tandand */
- YYSYMBOL_There = 11, /* There */
- YYSYMBOL_Tredir = 12, /* Tredir */
- YYSYMBOL_Tpipe = 13, /* Tpipe */
+ YYSYMBOL_Tfor = 3, /* Tfor */
+ YYSYMBOL_Tin = 4, /* Tin */
+ YYSYMBOL_Twhile = 5, /* Twhile */
+ YYSYMBOL_Tif = 6, /* Tif */
+ YYSYMBOL_Telse = 7, /* Telse */
+ YYSYMBOL_Tswitch = 8, /* Tswitch */
+ YYSYMBOL_Ttwiddle = 9, /* Ttwiddle */
+ YYSYMBOL_Tbang = 10, /* Tbang */
+ YYSYMBOL_Tsubshell = 11, /* Tsubshell */
+ YYSYMBOL_Tfunc = 12, /* Tfunc */
+ YYSYMBOL_Tredir = 13, /* Tredir */
YYSYMBOL_Tdup = 14, /* Tdup */
- YYSYMBOL_Tbasic = 15, /* Tbasic */
- YYSYMBOL_Tparen = 16, /* Tparen */
- YYSYMBOL_Tblock = 17, /* Tblock */
+ YYSYMBOL_Tpipe = 15, /* Tpipe */
+ YYSYMBOL_Tindex = 16, /* Tindex */
+ YYSYMBOL_Tbasic = 17, /* Tbasic */
YYSYMBOL_Targs = 18, /* Targs */
- YYSYMBOL_Tindex = 19, /* Tindex */
- YYSYMBOL_Twhile = 20, /* Twhile */
- YYSYMBOL_21_n_ = 21, /* '\n' */
- YYSYMBOL_22_ = 22, /* '^' */
- YYSYMBOL_23_ = 23, /* '$' */
- YYSYMBOL_Tcount = 24, /* Tcount */
- YYSYMBOL_Tjoin = 25, /* Tjoin */
- YYSYMBOL_26_ = 26, /* '(' */
- YYSYMBOL_27_ = 27, /* ')' */
- YYSYMBOL_28_ = 28, /* '{' */
- YYSYMBOL_29_ = 29, /* '}' */
- YYSYMBOL_30_ = 30, /* ';' */
- YYSYMBOL_31_ = 31, /* '&' */
- YYSYMBOL_32_ = 32, /* '=' */
- YYSYMBOL_YYACCEPT = 33, /* $accept */
- YYSYMBOL_rc = 34, /* rc */
- YYSYMBOL_line = 35, /* line */
- YYSYMBOL_body = 36, /* body */
- YYSYMBOL_paren = 37, /* paren */
- YYSYMBOL_block = 38, /* block */
- YYSYMBOL_cmds = 39, /* cmds */
- YYSYMBOL_cmdsln = 40, /* cmdsln */
- YYSYMBOL_ifbody = 41, /* ifbody */
- YYSYMBOL_assign = 42, /* assign */
- YYSYMBOL_redir = 43, /* redir */
- YYSYMBOL_epilog = 44, /* epilog */
- YYSYMBOL_cmd = 45, /* cmd */
- YYSYMBOL_basic = 46, /* basic */
- YYSYMBOL_atom = 47, /* atom */
- YYSYMBOL_word = 48, /* word */
- YYSYMBOL_executable = 49, /* executable */
- YYSYMBOL_nonkeyword = 50, /* nonkeyword */
- YYSYMBOL_keyword = 51, /* keyword */
- YYSYMBOL_wordsnl = 52, /* wordsnl */
- YYSYMBOL_nl = 53 /* nl */
+ YYSYMBOL_Tword = 19, /* Tword */
+ YYSYMBOL_Twords = 20, /* Twords */
+ YYSYMBOL_Tparen = 21, /* Tparen */
+ YYSYMBOL_Tblock = 22, /* Tblock */
+ YYSYMBOL_23_ = 23, /* ')' */
+ YYSYMBOL_Tandand = 24, /* Tandand */
+ YYSYMBOL_Toror = 25, /* Toror */
+ YYSYMBOL_26_n_ = 26, /* '\n' */
+ YYSYMBOL_27_ = 27, /* '^' */
+ YYSYMBOL_28_ = 28, /* '$' */
+ YYSYMBOL_Tcount = 29, /* Tcount */
+ YYSYMBOL_Tjoin = 30, /* Tjoin */
+ YYSYMBOL_31_ = 31, /* '(' */
+ YYSYMBOL_32_ = 32, /* '{' */
+ YYSYMBOL_33_ = 33, /* '}' */
+ YYSYMBOL_34_ = 34, /* ';' */
+ YYSYMBOL_35_ = 35, /* '&' */
+ YYSYMBOL_36_ = 36, /* '=' */
+ YYSYMBOL_YYACCEPT = 37, /* $accept */
+ YYSYMBOL_rc = 38, /* rc */
+ YYSYMBOL_line = 39, /* line */
+ YYSYMBOL_body = 40, /* body */
+ YYSYMBOL_paren = 41, /* paren */
+ YYSYMBOL_block = 42, /* block */
+ YYSYMBOL_cmds = 43, /* cmds */
+ YYSYMBOL_cmdsln = 44, /* cmdsln */
+ YYSYMBOL_ifbody = 45, /* ifbody */
+ YYSYMBOL_assign = 46, /* assign */
+ YYSYMBOL_redir = 47, /* redir */
+ YYSYMBOL_epilog = 48, /* epilog */
+ YYSYMBOL_cmd = 49, /* cmd */
+ YYSYMBOL_basic = 50, /* basic */
+ YYSYMBOL_atom = 51, /* atom */
+ YYSYMBOL_word = 52, /* word */
+ YYSYMBOL_executable = 53, /* executable */
+ YYSYMBOL_nonkeyword = 54, /* nonkeyword */
+ YYSYMBOL_keyword = 55, /* keyword */
+ YYSYMBOL_wordsnl = 56, /* wordsnl */
+ YYSYMBOL_nl = 57 /* nl */
};
typedef enum yysymbol_kind_t yysymbol_kind_t;
@@ -481,21 +485,21 @@ union yyalloc
#endif /* !YYCOPY_NEEDED */
/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 42
+#define YYFINAL 47
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 155
+#define YYLAST 195
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 33
+#define YYNTOKENS 37
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 21
/* YYNRULES -- Number of rules. */
-#define YYNRULES 52
+#define YYNRULES 59
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 79
+#define YYNSTATES 90
/* YYMAXUTOK -- Last valid token kind. */
-#define YYMAXUTOK 277
+#define YYMAXUTOK 281
/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -510,18 +514,18 @@ union yyalloc
static const yytype_int8 yytranslate[] =
{
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 21, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 23, 2, 31, 2,
- 26, 27, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 30,
- 2, 32, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 28, 2, 35, 2,
+ 31, 23, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 34,
+ 2, 36, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 22, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 27, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 28, 2, 29, 2, 2, 2, 2,
+ 2, 2, 2, 32, 2, 33, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -536,7 +540,8 @@ static const yytype_int8 yytranslate[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 24, 25
+ 15, 16, 17, 18, 19, 20, 21, 22, 24, 25,
+ 29, 30
};
#if YYDEBUG
@@ -546,9 +551,9 @@ static const yytype_uint8 yyrline[] =
0, 38, 38, 39, 42, 43, 46, 47, 50, 53,
56, 57, 60, 61, 64, 65, 68, 71, 72, 75,
76, 79, 80, 81, 82, 83, 84, 85, 86, 87,
- 90, 91, 92, 95, 96, 99, 100, 103, 104, 107,
- 108, 109, 110, 111, 115, 115, 115, 115, 122, 123,
- 124, 126, 128
+ 88, 89, 92, 93, 94, 97, 98, 101, 102, 105,
+ 106, 109, 110, 111, 112, 113, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 124, 125, 126, 128, 130
};
#endif
@@ -564,14 +569,14 @@ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
static const char *const yytname[] =
{
- "\"end of file\"", "error", "\"invalid token\"", "Tword", "Twords",
- "Tif", "Telse", "Tbang", "Tsubshell", "Toror", "Tandand", "There",
- "Tredir", "Tpipe", "Tdup", "Tbasic", "Tparen", "Tblock", "Targs",
- "Tindex", "Twhile", "'\\n'", "'^'", "'$'", "Tcount", "Tjoin", "'('",
- "')'", "'{'", "'}'", "';'", "'&'", "'='", "$accept", "rc", "line",
- "body", "paren", "block", "cmds", "cmdsln", "ifbody", "assign", "redir",
- "epilog", "cmd", "basic", "atom", "word", "executable", "nonkeyword",
- "keyword", "wordsnl", "nl", YY_NULLPTR
+ "\"end of file\"", "error", "\"invalid token\"", "Tfor", "Tin",
+ "Twhile", "Tif", "Telse", "Tswitch", "Ttwiddle", "Tbang", "Tsubshell",
+ "Tfunc", "Tredir", "Tdup", "Tpipe", "Tindex", "Tbasic", "Targs", "Tword",
+ "Twords", "Tparen", "Tblock", "')'", "Tandand", "Toror", "'\\n'", "'^'",
+ "'$'", "Tcount", "Tjoin", "'('", "'{'", "'}'", "';'", "'&'", "'='",
+ "$accept", "rc", "line", "body", "paren", "block", "cmds", "cmdsln",
+ "ifbody", "assign", "redir", "epilog", "cmd", "basic", "atom", "word",
+ "executable", "nonkeyword", "keyword", "wordsnl", "nl", YY_NULLPTR
};
static const char *
@@ -581,7 +586,7 @@ yysymbol_name (yysymbol_kind_t yysymbol)
}
#endif
-#define YYPACT_NINF (-42)
+#define YYPACT_NINF (-34)
#define yypact_value_is_default(Yyn) \
((Yyn) == YYPACT_NINF)
@@ -595,14 +600,15 @@ yysymbol_name (yysymbol_kind_t yysymbol)
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- 22, -42, -24, 75, 75, 129, -42, 129, 129, 129,
- -42, 75, 26, -10, -5, 75, 75, 75, 8, 105,
- 32, -42, 75, -42, 19, 19, -42, -42, -42, -42,
- -42, 18, -42, -42, -42, -42, -42, 99, 4, -42,
- 75, 31, -42, -42, -5, -42, -42, 19, 19, -42,
- -42, -42, -42, 18, 129, 129, 24, 67, 129, -42,
- -42, 18, -42, -42, -42, -42, 67, -42, 18, -42,
- -42, 127, -42, 19, -42, -42, -42, 67, 19
+ 70, -24, 163, 163, 129, -34, -34, 129, 129, 129,
+ -34, 163, 26, 2, 38, 163, 163, 163, 62, 27,
+ 17, -34, 163, -34, 30, 30, -34, -34, -34, -34,
+ -34, -34, -34, -34, -34, -34, 21, -34, -34, -34,
+ -34, -34, 100, 16, -34, 163, 146, -34, -34, 38,
+ -34, -34, 30, 30, -34, -34, -34, -34, -34, -34,
+ 21, 129, 129, 45, 136, 129, -34, -34, 21, -34,
+ -34, -34, -34, 136, 136, 136, -34, 21, -34, -34,
+ 11, -34, 35, -34, -34, 30, 30, -34, 136, 35
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -610,30 +616,31 @@ static const yytype_int16 yypact[] =
means the default is an error. */
static const yytype_int8 yydefact[] =
{
- 21, 39, 0, 21, 21, 0, 17, 0, 0, 0,
- 48, 21, 0, 0, 19, 21, 21, 21, 4, 22,
- 30, 37, 21, 51, 28, 29, 44, 45, 46, 47,
- 35, 18, 33, 34, 40, 42, 43, 0, 0, 12,
- 21, 6, 1, 3, 19, 23, 5, 26, 25, 51,
- 10, 11, 32, 31, 0, 0, 0, 21, 0, 49,
- 41, 50, 9, 7, 13, 20, 21, 38, 16, 8,
- 52, 19, 27, 14, 36, 24, 51, 21, 15
+ 21, 0, 21, 21, 0, 17, 41, 0, 0, 0,
+ 55, 21, 0, 0, 19, 21, 21, 21, 4, 22,
+ 32, 39, 21, 58, 29, 30, 47, 46, 48, 49,
+ 50, 51, 52, 53, 54, 37, 18, 35, 36, 42,
+ 44, 45, 0, 0, 12, 21, 6, 1, 3, 19,
+ 23, 5, 28, 27, 58, 58, 58, 10, 11, 34,
+ 33, 0, 0, 0, 21, 0, 43, 56, 57, 9,
+ 7, 13, 20, 21, 21, 21, 40, 16, 8, 59,
+ 19, 31, 14, 38, 24, 25, 26, 58, 21, 15
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int8 yypgoto[] =
{
- -42, -42, 34, 15, -42, -4, 28, -42, -42, -42,
- -13, 12, 0, -42, 11, -14, -42, 5, -42, -42,
- -41
+ -34, -34, 46, -3, -34, 7, 14, -34, -34, -34,
+ -13, 23, 0, -34, 4, -15, -34, 1, -34, -34,
+ -33
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int8 yydefgoto[] =
{
- 0, 12, 13, 38, 23, 14, 39, 40, 72, 16,
- 17, 45, 41, 19, 30, 31, 20, 21, 33, 37,
- 57
+ 0, 12, 13, 43, 23, 14, 44, 45, 81, 16,
+ 17, 50, 46, 19, 35, 36, 20, 21, 38, 42,
+ 64
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -641,67 +648,76 @@ static const yytype_int8 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_int8 yytable[] =
{
- 18, 44, 22, 24, 25, 53, 52, 5, 66, 6,
- 32, 43, 32, 32, 32, 18, 47, 48, 34, 35,
- 36, 49, -2, 61, 32, 1, 42, 2, 15, 3,
- 4, 44, 49, 62, 5, 77, 6, 56, 50, 51,
- 58, 68, 32, 15, 49, 7, 8, 9, 10, 46,
- 11, 69, 64, 71, 54, 63, 65, 73, 44, 32,
- 32, 50, 51, 32, 55, 67, 75, 0, 0, 74,
- 1, 0, 2, 0, 3, 4, 0, 78, 1, 5,
- 2, 6, 3, 4, 0, 0, 0, 5, 70, 6,
- 7, 8, 9, 10, 0, 11, 0, 0, 7, 8,
- 9, 10, 1, 11, 26, 27, 28, 29, 1, 0,
- 26, 27, 28, 29, 0, 0, 0, 5, 0, 6,
- 59, 0, 7, 8, 9, 10, 60, 0, 7, 8,
- 9, 10, 1, 76, 26, 27, 28, 29, 0, 5,
- 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 7, 8, 9, 10
+ 18, 49, 24, 25, 60, 37, 59, 22, 37, 37,
+ 37, 39, 40, 41, 15, 18, 52, 53, 87, 63,
+ 37, 73, 74, 75, 4, 5, 47, 68, 48, 15,
+ 26, 27, 28, 29, 30, 31, 49, 32, 33, 34,
+ 4, 5, 70, 37, 61, 54, 6, 77, 65, 69,
+ 54, 4, 5, 62, 88, 7, 8, 9, 10, 55,
+ 56, 51, 37, 37, 82, 76, 37, 49, 78, 83,
+ -2, 80, 72, 84, 85, 86, 1, 54, 0, 0,
+ 2, 3, 0, 4, 5, 0, 55, 56, 89, 6,
+ 0, 0, 0, 0, 0, 0, 57, 58, 7, 8,
+ 9, 10, 11, 26, 27, 28, 29, 30, 31, 0,
+ 32, 33, 34, 0, 0, 0, 0, 0, 0, 6,
+ 0, 0, 0, 66, 0, 0, 67, 0, 7, 8,
+ 9, 10, 26, 27, 28, 29, 30, 31, 0, 32,
+ 33, 34, 1, 0, 0, 0, 2, 3, 6, 4,
+ 5, 0, 0, 0, 0, 6, 0, 7, 8, 9,
+ 10, 54, 79, 0, 7, 8, 9, 10, 11, 1,
+ 55, 56, 71, 2, 3, 0, 4, 5, 0, 0,
+ 57, 58, 6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 8, 9, 10, 11
};
static const yytype_int8 yycheck[] =
{
- 0, 14, 26, 3, 4, 19, 19, 12, 49, 14,
- 5, 21, 7, 8, 9, 15, 16, 17, 7, 8,
- 9, 13, 0, 37, 19, 3, 0, 5, 0, 7,
- 8, 44, 13, 29, 12, 76, 14, 22, 30, 31,
- 22, 55, 37, 15, 13, 23, 24, 25, 26, 15,
- 28, 27, 21, 57, 22, 40, 44, 57, 71, 54,
- 55, 30, 31, 58, 32, 54, 66, -1, -1, 58,
- 3, -1, 5, -1, 7, 8, -1, 77, 3, 12,
- 5, 14, 7, 8, -1, -1, -1, 12, 21, 14,
- 23, 24, 25, 26, -1, 28, -1, -1, 23, 24,
- 25, 26, 3, 28, 5, 6, 7, 8, 3, -1,
- 5, 6, 7, 8, -1, -1, -1, 12, -1, 14,
- 21, -1, 23, 24, 25, 26, 27, -1, 23, 24,
- 25, 26, 3, 6, 5, 6, 7, 8, -1, 12,
- -1, 14, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 23, 24, 25, 26
+ 0, 14, 2, 3, 19, 4, 19, 31, 7, 8,
+ 9, 7, 8, 9, 0, 15, 16, 17, 7, 22,
+ 19, 54, 55, 56, 13, 14, 0, 42, 26, 15,
+ 3, 4, 5, 6, 7, 8, 49, 10, 11, 12,
+ 13, 14, 45, 42, 27, 15, 19, 62, 27, 33,
+ 15, 13, 14, 36, 87, 28, 29, 30, 31, 24,
+ 25, 15, 61, 62, 64, 61, 65, 80, 23, 65,
+ 0, 64, 49, 73, 74, 75, 6, 15, -1, -1,
+ 10, 11, -1, 13, 14, -1, 24, 25, 88, 19,
+ -1, -1, -1, -1, -1, -1, 34, 35, 28, 29,
+ 30, 31, 32, 3, 4, 5, 6, 7, 8, -1,
+ 10, 11, 12, -1, -1, -1, -1, -1, -1, 19,
+ -1, -1, -1, 23, -1, -1, 26, -1, 28, 29,
+ 30, 31, 3, 4, 5, 6, 7, 8, -1, 10,
+ 11, 12, 6, -1, -1, -1, 10, 11, 19, 13,
+ 14, -1, -1, -1, -1, 19, -1, 28, 29, 30,
+ 31, 15, 26, -1, 28, 29, 30, 31, 32, 6,
+ 24, 25, 26, 10, 11, -1, 13, 14, -1, -1,
+ 34, 35, 19, -1, -1, -1, -1, -1, -1, -1,
+ -1, 28, 29, 30, 31, 32
};
/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
state STATE-NUM. */
static const yytype_int8 yystos[] =
{
- 0, 3, 5, 7, 8, 12, 14, 23, 24, 25,
- 26, 28, 34, 35, 38, 39, 42, 43, 45, 46,
- 49, 50, 26, 37, 45, 45, 5, 6, 7, 8,
- 47, 48, 50, 51, 47, 47, 47, 52, 36, 39,
- 40, 45, 0, 21, 43, 44, 35, 45, 45, 13,
- 30, 31, 43, 48, 22, 32, 36, 53, 22, 21,
- 27, 48, 29, 36, 21, 44, 53, 47, 48, 27,
- 21, 38, 41, 45, 47, 45, 6, 53, 45
+ 0, 6, 10, 11, 13, 14, 19, 28, 29, 30,
+ 31, 32, 38, 39, 42, 43, 46, 47, 49, 50,
+ 53, 54, 31, 41, 49, 49, 3, 4, 5, 6,
+ 7, 8, 10, 11, 12, 51, 52, 54, 55, 51,
+ 51, 51, 56, 40, 43, 44, 49, 0, 26, 47,
+ 48, 39, 49, 49, 15, 24, 25, 34, 35, 47,
+ 52, 27, 36, 40, 57, 27, 23, 26, 52, 33,
+ 40, 26, 48, 57, 57, 57, 51, 52, 23, 26,
+ 42, 45, 49, 51, 49, 49, 49, 7, 57, 49
};
/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
static const yytype_int8 yyr1[] =
{
- 0, 33, 34, 34, 35, 35, 36, 36, 37, 38,
- 39, 39, 40, 40, 41, 41, 42, 43, 43, 44,
- 44, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 46, 46, 46, 47, 47, 48, 48, 49, 49, 50,
- 50, 50, 50, 50, 51, 51, 51, 51, 52, 52,
- 52, 53, 53
+ 0, 37, 38, 38, 39, 39, 40, 40, 41, 42,
+ 43, 43, 44, 44, 45, 45, 46, 47, 47, 48,
+ 48, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 50, 50, 50, 51, 51, 52, 52, 53,
+ 53, 54, 54, 54, 54, 54, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 56, 56, 56, 57, 57
};
/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
@@ -709,10 +725,10 @@ static const yytype_int8 yyr2[] =
{
0, 2, 0, 2, 1, 2, 1, 2, 3, 3,
2, 2, 1, 2, 1, 4, 3, 1, 2, 0,
- 2, 0, 1, 2, 4, 2, 2, 4, 2, 2,
- 1, 2, 2, 1, 1, 1, 3, 1, 3, 1,
- 2, 3, 2, 2, 1, 1, 1, 1, 0, 2,
- 2, 0, 2
+ 2, 0, 1, 2, 4, 4, 4, 2, 2, 2,
+ 2, 4, 1, 2, 2, 1, 1, 1, 3, 1,
+ 3, 1, 2, 3, 2, 2, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 2, 2, 0, 2
};
@@ -1448,203 +1464,215 @@ yyreduce:
case 2: /* rc: %empty */
#line 38 "sys/cmd/rc/syntax.y"
{ return 0; }
-#line 1452 "sys/cmd/rc/parse.c"
+#line 1468 "sys/cmd/rc/parse.c"
break;
case 3: /* rc: line '\n' */
#line 39 "sys/cmd/rc/syntax.y"
{ return compile((yyvsp[-1].tree)); }
-#line 1458 "sys/cmd/rc/parse.c"
+#line 1474 "sys/cmd/rc/parse.c"
break;
case 5: /* line: cmds line */
#line 43 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2(';', (yyvsp[-1].tree), (yyvsp[0].tree)); }
-#line 1464 "sys/cmd/rc/parse.c"
+#line 1480 "sys/cmd/rc/parse.c"
break;
case 7: /* body: cmdsln body */
#line 47 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2(';', (yyvsp[-1].tree), (yyvsp[0].tree)); }
-#line 1470 "sys/cmd/rc/parse.c"
+#line 1486 "sys/cmd/rc/parse.c"
break;
case 8: /* paren: '(' body ')' */
#line 50 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1(Tparen, (yyvsp[-1].tree)); }
-#line 1476 "sys/cmd/rc/parse.c"
+#line 1492 "sys/cmd/rc/parse.c"
break;
case 9: /* block: '{' body '}' */
#line 53 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1(Tblock, (yyvsp[-1].tree)); }
-#line 1482 "sys/cmd/rc/parse.c"
+#line 1498 "sys/cmd/rc/parse.c"
break;
case 11: /* cmds: cmd '&' */
#line 57 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1('&', (yyvsp[-1].tree)); }
-#line 1488 "sys/cmd/rc/parse.c"
+#line 1504 "sys/cmd/rc/parse.c"
break;
case 14: /* ifbody: cmd */
#line 64 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2(Tif, nil, (yyvsp[0].tree)); }
-#line 1494 "sys/cmd/rc/parse.c"
+#line 1510 "sys/cmd/rc/parse.c"
break;
case 15: /* ifbody: block Telse nl cmd */
#line 65 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree3(Tif, nil, (yyvsp[-3].tree), (yyvsp[-2].tree)); }
-#line 1500 "sys/cmd/rc/parse.c"
+#line 1516 "sys/cmd/rc/parse.c"
break;
case 16: /* assign: executable '=' word */
#line 68 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2('=', (yyvsp[-2].tree), (yyvsp[0].tree)); }
-#line 1506 "sys/cmd/rc/parse.c"
+#line 1522 "sys/cmd/rc/parse.c"
break;
case 18: /* redir: Tredir word */
#line 72 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = hangchild1((yyvsp[-1].tree), (yyvsp[0].tree), 0); }
-#line 1512 "sys/cmd/rc/parse.c"
+#line 1528 "sys/cmd/rc/parse.c"
break;
case 19: /* epilog: %empty */
#line 75 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = nil; }
-#line 1518 "sys/cmd/rc/parse.c"
+#line 1534 "sys/cmd/rc/parse.c"
break;
case 20: /* epilog: redir epilog */
#line 76 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = hangchild1((yyvsp[-1].tree), (yyvsp[0].tree), 1); }
-#line 1524 "sys/cmd/rc/parse.c"
+#line 1540 "sys/cmd/rc/parse.c"
break;
case 21: /* cmd: %empty */
#line 79 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = nil; }
-#line 1530 "sys/cmd/rc/parse.c"
+#line 1546 "sys/cmd/rc/parse.c"
break;
case 22: /* cmd: basic */
#line 80 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1(Tbasic, (yyvsp[0].tree)); }
-#line 1536 "sys/cmd/rc/parse.c"
+#line 1552 "sys/cmd/rc/parse.c"
break;
case 23: /* cmd: block epilog */
#line 81 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = hangepilog((yyvsp[-1].tree), (yyvsp[0].tree)); }
-#line 1542 "sys/cmd/rc/parse.c"
+#line 1558 "sys/cmd/rc/parse.c"
break;
case 24: /* cmd: cmd Tpipe nl cmd */
#line 82 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = hangchild2((yyvsp[-2].tree), (yyvsp[-3].tree), 0, (yyvsp[0].tree), 1); }
-#line 1548 "sys/cmd/rc/parse.c"
+#line 1564 "sys/cmd/rc/parse.c"
break;
- case 25: /* cmd: redir cmd */
+ case 25: /* cmd: cmd Tandand nl cmd */
#line 83 "sys/cmd/rc/syntax.y"
- { (yyval.tree) = hangchild1((yyvsp[-1].tree), (yyvsp[0].tree), 1); }
-#line 1554 "sys/cmd/rc/parse.c"
+ { (yyval.tree) = maketree2(Tandand, (yyvsp[-3].tree), (yyvsp[0].tree)); }
+#line 1570 "sys/cmd/rc/parse.c"
break;
- case 26: /* cmd: assign cmd */
+ case 26: /* cmd: cmd Toror nl cmd */
#line 84 "sys/cmd/rc/syntax.y"
- { (yyval.tree) = hangchild1((yyvsp[-1].tree), (yyvsp[0].tree), 2); }
-#line 1560 "sys/cmd/rc/parse.c"
+ { (yyval.tree) = maketree2(Toror, (yyvsp[-3].tree), (yyvsp[0].tree)); }
+#line 1576 "sys/cmd/rc/parse.c"
break;
- case 27: /* cmd: Tif paren nl ifbody */
+ case 27: /* cmd: redir cmd */
#line 85 "sys/cmd/rc/syntax.y"
- { (yyval.tree) = hangchild1((yyvsp[-2].tree), (yyvsp[-3].tree), 0); }
-#line 1566 "sys/cmd/rc/parse.c"
+ { (yyval.tree) = hangchild1((yyvsp[-1].tree), (yyvsp[0].tree), 1); }
+#line 1582 "sys/cmd/rc/parse.c"
break;
- case 28: /* cmd: Tbang cmd */
+ case 28: /* cmd: assign cmd */
#line 86 "sys/cmd/rc/syntax.y"
- { (yyval.tree) = maketree1(Tbang, (yyvsp[0].tree)); }
-#line 1572 "sys/cmd/rc/parse.c"
+ { (yyval.tree) = hangchild1((yyvsp[-1].tree), (yyvsp[0].tree), 2); }
+#line 1588 "sys/cmd/rc/parse.c"
break;
- case 29: /* cmd: Tsubshell cmd */
+ case 29: /* cmd: Tbang cmd */
#line 87 "sys/cmd/rc/syntax.y"
+ { (yyval.tree) = maketree1(Tbang, (yyvsp[0].tree)); }
+#line 1594 "sys/cmd/rc/parse.c"
+ break;
+
+ case 30: /* cmd: Tsubshell cmd */
+#line 88 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1(Tsubshell, (yyvsp[0].tree)); }
-#line 1578 "sys/cmd/rc/parse.c"
+#line 1600 "sys/cmd/rc/parse.c"
+ break;
+
+ case 31: /* cmd: Tif paren nl ifbody */
+#line 89 "sys/cmd/rc/syntax.y"
+ { (yyval.tree) = hangchild1((yyvsp[-2].tree), (yyvsp[-3].tree), 0); }
+#line 1606 "sys/cmd/rc/parse.c"
break;
- case 31: /* basic: basic word */
-#line 91 "sys/cmd/rc/syntax.y"
+ case 33: /* basic: basic word */
+#line 93 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2(Targs, (yyvsp[-1].tree), (yyvsp[0].tree)); }
-#line 1584 "sys/cmd/rc/parse.c"
+#line 1612 "sys/cmd/rc/parse.c"
break;
- case 32: /* basic: basic redir */
-#line 92 "sys/cmd/rc/syntax.y"
+ case 34: /* basic: basic redir */
+#line 94 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2(Targs, (yyvsp[-1].tree), (yyvsp[0].tree)); }
-#line 1590 "sys/cmd/rc/parse.c"
+#line 1618 "sys/cmd/rc/parse.c"
break;
- case 34: /* atom: keyword */
-#line 96 "sys/cmd/rc/syntax.y"
+ case 36: /* atom: keyword */
+#line 98 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1(Tword, (yyvsp[0].tree)); }
-#line 1596 "sys/cmd/rc/parse.c"
+#line 1624 "sys/cmd/rc/parse.c"
break;
- case 36: /* word: word '^' atom */
-#line 100 "sys/cmd/rc/syntax.y"
+ case 38: /* word: word '^' atom */
+#line 102 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2('^', (yyvsp[-2].tree), (yyvsp[0].tree)); }
-#line 1602 "sys/cmd/rc/parse.c"
+#line 1630 "sys/cmd/rc/parse.c"
break;
- case 38: /* executable: executable '^' atom */
-#line 104 "sys/cmd/rc/syntax.y"
+ case 40: /* executable: executable '^' atom */
+#line 106 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree2('^', (yyvsp[-2].tree), (yyvsp[0].tree)); }
-#line 1608 "sys/cmd/rc/parse.c"
+#line 1636 "sys/cmd/rc/parse.c"
break;
- case 40: /* nonkeyword: '$' atom */
-#line 108 "sys/cmd/rc/syntax.y"
+ case 42: /* nonkeyword: '$' atom */
+#line 110 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1('$', (yyvsp[0].tree)); }
-#line 1614 "sys/cmd/rc/parse.c"
+#line 1642 "sys/cmd/rc/parse.c"
break;
- case 41: /* nonkeyword: '(' wordsnl ')' */
-#line 109 "sys/cmd/rc/syntax.y"
+ case 43: /* nonkeyword: '(' wordsnl ')' */
+#line 111 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = (yyvsp[-1].tree); }
-#line 1620 "sys/cmd/rc/parse.c"
+#line 1648 "sys/cmd/rc/parse.c"
break;
- case 42: /* nonkeyword: Tcount atom */
-#line 110 "sys/cmd/rc/syntax.y"
+ case 44: /* nonkeyword: Tcount atom */
+#line 112 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1(Tcount, (yyvsp[0].tree)); }
-#line 1626 "sys/cmd/rc/parse.c"
+#line 1654 "sys/cmd/rc/parse.c"
break;
- case 43: /* nonkeyword: Tjoin atom */
-#line 111 "sys/cmd/rc/syntax.y"
+ case 45: /* nonkeyword: Tjoin atom */
+#line 113 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = maketree1(Tjoin, (yyvsp[0].tree)); }
-#line 1632 "sys/cmd/rc/parse.c"
+#line 1660 "sys/cmd/rc/parse.c"
break;
- case 48: /* wordsnl: %empty */
-#line 122 "sys/cmd/rc/syntax.y"
+ case 55: /* wordsnl: %empty */
+#line 124 "sys/cmd/rc/syntax.y"
{ (yyval.tree) = nil; }
-#line 1638 "sys/cmd/rc/parse.c"
+#line 1666 "sys/cmd/rc/parse.c"
break;
- case 50: /* wordsnl: wordsnl word */
-#line 124 "sys/cmd/rc/syntax.y"
+ case 57: /* wordsnl: wordsnl word */
+#line 126 "sys/cmd/rc/syntax.y"
{(yyval.tree) = (!(yyvsp[-1].tree)) ? ((!(yyvsp[0].tree)) ? nil : (yyvsp[0].tree)) : ((!(yyvsp[0].tree)) ? (yyvsp[-1].tree) : maketree2(Twords, (yyvsp[-1].tree), (yyvsp[0].tree))); }
-#line 1644 "sys/cmd/rc/parse.c"
+#line 1672 "sys/cmd/rc/parse.c"
break;
-#line 1648 "sys/cmd/rc/parse.c"
+#line 1676 "sys/cmd/rc/parse.c"
default: break;
}
@@ -1868,5 +1896,5 @@ yyreturnlab:
return yyresult;
}
-#line 129 "sys/cmd/rc/syntax.y"
+#line 131 "sys/cmd/rc/syntax.y"
diff --git a/sys/cmd/rc/parse.h b/sys/cmd/rc/parse.h
index 64d567a..5955904 100644
--- a/sys/cmd/rc/parse.h
+++ b/sys/cmd/rc/parse.h
@@ -54,26 +54,30 @@ extern int yydebug;
YYEOF = 0, /* "end of file" */
YYerror = 256, /* error */
YYUNDEF = 257, /* "invalid token" */
- Tword = 258, /* Tword */
- Twords = 259, /* Twords */
- Tif = 260, /* Tif */
- Telse = 261, /* Telse */
- Tbang = 262, /* Tbang */
- Tsubshell = 263, /* Tsubshell */
- Toror = 264, /* Toror */
- Tandand = 265, /* Tandand */
- There = 266, /* There */
- Tredir = 267, /* Tredir */
- Tpipe = 268, /* Tpipe */
+ Tfor = 258, /* Tfor */
+ Tin = 259, /* Tin */
+ Twhile = 260, /* Twhile */
+ Tif = 261, /* Tif */
+ Telse = 262, /* Telse */
+ Tswitch = 263, /* Tswitch */
+ Ttwiddle = 264, /* Ttwiddle */
+ Tbang = 265, /* Tbang */
+ Tsubshell = 266, /* Tsubshell */
+ Tfunc = 267, /* Tfunc */
+ Tredir = 268, /* Tredir */
Tdup = 269, /* Tdup */
- Tbasic = 270, /* Tbasic */
- Tparen = 271, /* Tparen */
- Tblock = 272, /* Tblock */
+ Tpipe = 270, /* Tpipe */
+ Tindex = 271, /* Tindex */
+ Tbasic = 272, /* Tbasic */
Targs = 273, /* Targs */
- Tindex = 274, /* Tindex */
- Twhile = 275, /* Twhile */
- Tcount = 276, /* Tcount */
- Tjoin = 277 /* Tjoin */
+ Tword = 274, /* Tword */
+ Twords = 275, /* Twords */
+ Tparen = 276, /* Tparen */
+ Tblock = 277, /* Tblock */
+ Tandand = 278, /* Tandand */
+ Toror = 279, /* Toror */
+ Tcount = 280, /* Tcount */
+ Tjoin = 281 /* Tjoin */
};
typedef enum yytokentype yytoken_kind_t;
#endif
@@ -82,26 +86,30 @@ extern int yydebug;
#define YYEOF 0
#define YYerror 256
#define YYUNDEF 257
-#define Tword 258
-#define Twords 259
-#define Tif 260
-#define Telse 261
-#define Tbang 262
-#define Tsubshell 263
-#define Toror 264
-#define Tandand 265
-#define There 266
-#define Tredir 267
-#define Tpipe 268
+#define Tfor 258
+#define Tin 259
+#define Twhile 260
+#define Tif 261
+#define Telse 262
+#define Tswitch 263
+#define Ttwiddle 264
+#define Tbang 265
+#define Tsubshell 266
+#define Tfunc 267
+#define Tredir 268
#define Tdup 269
-#define Tbasic 270
-#define Tparen 271
-#define Tblock 272
+#define Tpipe 270
+#define Tindex 271
+#define Tbasic 272
#define Targs 273
-#define Tindex 274
-#define Twhile 275
-#define Tcount 276
-#define Tjoin 277
+#define Tword 274
+#define Twords 275
+#define Tparen 276
+#define Tblock 277
+#define Tandand 278
+#define Toror 279
+#define Tcount 280
+#define Tjoin 281
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -111,7 +119,7 @@ union YYSTYPE
struct Tree *tree;
-#line 115 "sys/cmd/rc/parse.h"
+#line 123 "sys/cmd/rc/parse.h"
};
typedef union YYSTYPE YYSTYPE;
diff --git a/sys/cmd/rc/prompt.c b/sys/cmd/rc/prompt.c
index 3d05e41..7635bd8 100644
--- a/sys/cmd/rc/prompt.c
+++ b/sys/cmd/rc/prompt.c
@@ -9,7 +9,8 @@ prompt(ushort *flag)
runner->flag.eof = 1;
return 0;
}
- printf("\n");
+ print(shell.err, "\n");
+ flush(shell.err);
runner->line++;
*flag = 0;
}
diff --git a/sys/cmd/rc/syntax.y b/sys/cmd/rc/syntax.y
index b486484..2e7e1da 100644
--- a/sys/cmd/rc/syntax.y
+++ b/sys/cmd/rc/syntax.y
@@ -1,6 +1,6 @@
-%token Tword Twords Tif Telse Tbang Tsubshell
-%token Toror Tandand There Tredir Tpipe Tdup
-%token Tbasic Tparen Tblock Targs Tindex
+%token Tfor Tin Twhile Tif Telse Tswitch Ttwiddle Tbang Tsubshell Tfunc
+%token Tredir Tdup Tpipe Tindex
+%token Tbasic Targs Tword Twords Tparen Tblock
%define parse.error verbose
@@ -12,8 +12,8 @@
%}
/* operator precendence: lowest first */
-%left Twhile Telse
-%left '\n'
+%left Tif Tfor Tswitch ')' Twhile Telse
+%left Tandand Toror '\n'
%left Tbang Tsubshell
%left Tpipe;
%left '^';
@@ -26,7 +26,7 @@
}
%type<tree> line cmds cmdsln body paren block ifbody assign epilog redir;
%type<tree> cmd basic executable nonkeyword keyword word words wordsnl atom;
-%type<tree> Tbang Tsubshell Tif Telse;
+%type<tree> Tfor Tin Twhile Tif Telse Tswitch Ttwiddle Tbang Tsubshell Tfunc;
%type<tree> Tword Tredir Tpipe;
/* grammar */
@@ -80,11 +80,13 @@ cmd:
| basic { $$ = maketree1(Tbasic, $1); }
| block epilog { $$ = hangepilog($1, $2); }
| cmd Tpipe nl cmd { $$ = hangchild2($2, $1, 0, $4, 1); }
+| cmd Tandand nl cmd { $$ = maketree2(Tandand, $1, $4); }
+| cmd Toror nl cmd { $$ = maketree2(Toror, $1, $4); }
| redir cmd %prec Tbang { $$ = hangchild1($1, $2, 1); }
| assign cmd %prec Tbang { $$ = hangchild1($1, $2, 2); }
-| Tif paren nl ifbody { $$ = hangchild1($2, $1, 0); }
| Tbang cmd { $$ = maketree1(Tbang, $2); }
| Tsubshell cmd { $$ = maketree1(Tsubshell, $2); }
+| Tif paren nl ifbody { $$ = hangchild1($2, $1, 0); }
basic:
executable
@@ -112,7 +114,7 @@ nonkeyword:
//| '`' block { $$ = maketree1('`', $2); }
keyword:
- Tif|Telse|Tbang|Tsubshell
+ Tin|Tfor|Twhile|Tif|Telse|Tswitch|Tbang|Tsubshell|Tfunc
words:
/* empty */ { $$ = nil; }