From da77d3be2eb0785bc0c0b60c686e163d6243c744 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 21 Oct 2021 13:28:25 -0700 Subject: feat(rc): added andand and oror operators --- sys/cmd/rc/parse.c | 454 ++++++++++++++++++++++++++++------------------------- 1 file changed, 241 insertions(+), 213 deletions(-) (limited to 'sys/cmd/rc/parse.c') 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" -- cgit v1.2.1