#ifndef lint
#ident "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28.2.1 2001/07/19 05:46:39 peter Exp $"
#endif
#include <stdlib.h>
#define YYBYACC 1
#define YYMAJOR 1
#define YYMINOR 9
#define YYLEX yylex()
#define YYEMPTY -1
#define yyclearin (yychar=(YYEMPTY))
#define yyerrok (yyerrflag=0)
#define YYRECOVERING() (yyerrflag!=0)
#if defined(__cplusplus) || __STDC__
static int yygrowstack(void);
#else
static int yygrowstack();
#endif
#define yyparse bootparse
#define yylex bootlex
#define yyerror booterror
#define yychar bootchar
#define yyval bootval
#define yylval bootlval
#define yydebug bootdebug
#define yynerrs bootnerrs
#define yyerrflag booterrflag
#define yyss bootss
#define yyssp bootssp
#define yyvs bootvs
#define yyvsp bootvsp
#define yylhs bootlhs
#define yylen bootlen
#define yydefred bootdefred
#define yydgoto bootdgoto
#define yysindex bootsindex
#define yyrindex bootrindex
#define yygindex bootgindex
#define yytable boottable
#define yycheck bootcheck
#define yyname bootname
#define yyrule bootrule
#define yysslim bootsslim
#define yystacksize bootstacksize
#define YYPREFIX "boot"
#line 2 "boot.yy"
#define YYSTYPE char*
#include <assert.h>
#include <stdio.h>
#include <string>
#include "rtrmgr_module.h"
#include "libxorp/xorp.h"
#include "libxorp/xlog.h"
#include "conf_tree.hh"
#include "conf_tree_node.hh"
#include "template_tree.hh"
#include "template_tree_node.hh"
#include "config_operators.hh"
/* XXX: sigh - -p flag to yacc should do this for us */
#define yystacksize bootstacksize
#define yysslim bootsslim
#line 67 "y.boot_tab.c"
#define YYERRCODE 256
#define UPLEVEL 257
#define DOWNLEVEL 258
#define END 259
#define ASSIGN_OPERATOR 260
#define BOOL_VALUE 261
#define UINT_VALUE 262
#define UINTRANGE_VALUE 263
#define IPV4_VALUE 264
#define IPV4RANGE_VALUE 265
#define IPV4NET_VALUE 266
#define IPV6_VALUE 267
#define IPV6RANGE_VALUE 268
#define IPV6NET_VALUE 269
#define MACADDR_VALUE 270
#define URL_FILE_VALUE 271
#define URL_FTP_VALUE 272
#define URL_HTTP_VALUE 273
#define URL_TFTP_VALUE 274
#define LITERAL 275
#define STRING 276
#define ARITH 277
#define INFIX_OPERATOR 278
#define SYNTAX_ERROR 279
#define CONFIG_NODE_ID 280
const short bootlhs[] = { -1,
0, 0, 0, 0, 1, 1, 6, 4, 8, 8,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 5, 5, 7,
10, 10, 11, 11, 11, 2, 13, 13, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 3,
};
const short bootlen[] = { 2,
0, 2, 2, 1, 2, 2, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1, 1, 3,
0, 2, 1, 1, 1, 1, 1, 2, 2, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 1,
};
const short bootdefred[] = { 0,
36, 9, 56, 0, 0, 0, 0, 4, 0, 0,
0, 0, 10, 2, 3, 0, 29, 5, 28, 6,
14, 16, 15, 18, 17, 19, 21, 20, 22, 23,
24, 25, 26, 27, 13, 12, 11, 0, 0, 34,
35, 0, 0, 33, 0, 0, 30, 32, 39, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 41, 43, 42, 45,
44, 46, 48, 47, 49, 50, 51, 52, 53, 54,
40, 55,
};
const short bootdgoto[] = { 5,
6, 7, 8, 9, 18, 10, 19, 11, 12, 42,
43, 44, 45,
};
const short bootsindex[] = { -210,
0, 0, 0, -270, 0, -210, -210, 0, -233, -225,
-171, -250, 0, 0, 0, -208, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, -222, 0,
0, -201, -208, 0, -256, 0, 0, 0, 0, -188,
-200, -199, -198, -197, -196, -195, -193, -191, -172, -153,
-152, -151, -150, -149, -148, -147, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,
};
const short bootrindex[] = { 58,
0, 0, 0, 0, 0, 58, 58, 0, 0, 0,
-186, -205, 0, 0, 0, -145, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, -255, 0, 0,
0, 0, -145, 0, 0, -228, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,
};
const short bootgindex[] = { 49,
-16, -15, 0, 0, 0, 0, 104, 103, 0, 73,
0, 0, 0,
};
#define YYTABLESIZE 116
const short boottable[] = { 40,
41, 9, 49, 37, 13, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 50, 37, 16, 2, 17, 40, 41, 10, 4,
38, 16, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 1, 38,
1, 8, 46, 8, 14, 15, 47, 1, 67, 68,
69, 70, 71, 72, 2, 73, 38, 74, 3, 4,
7, 39, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63, 64, 75, 65, 66, 21,
22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 76, 77, 78, 79, 80,
81, 82, 31, 20, 37, 48,
};
const short bootcheck[] = { 16,
16, 257, 259, 259, 275, 261, 262, 263, 264, 265,
266, 267, 268, 269, 270, 271, 272, 273, 274, 275,
276, 278, 278, 257, 275, 259, 43, 43, 257, 280,
259, 257, 261, 262, 263, 264, 265, 266, 267, 268,
269, 270, 271, 272, 273, 274, 275, 276, 259, 278,
259, 257, 275, 259, 6, 7, 258, 0, 259, 259,
259, 259, 259, 259, 275, 259, 275, 259, 279, 280,
257, 280, 261, 262, 263, 264, 265, 266, 267, 268,
269, 270, 271, 272, 273, 274, 259, 276, 277, 261,
262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
272, 273, 274, 275, 276, 259, 259, 259, 259, 259,
259, 259, 258, 10, 12, 43,
};
#define YYFINAL 5
#ifndef YYDEBUG
#define YYDEBUG 0
#endif
#define YYMAXTOKEN 280
#if YYDEBUG
const char * const bootname[] = {
"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"UPLEVEL","DOWNLEVEL","END",
"ASSIGN_OPERATOR","BOOL_VALUE","UINT_VALUE","UINTRANGE_VALUE","IPV4_VALUE",
"IPV4RANGE_VALUE","IPV4NET_VALUE","IPV6_VALUE","IPV6RANGE_VALUE",
"IPV6NET_VALUE","MACADDR_VALUE","URL_FILE_VALUE","URL_FTP_VALUE",
"URL_HTTP_VALUE","URL_TFTP_VALUE","LITERAL","STRING","ARITH","INFIX_OPERATOR",
"SYNTAX_ERROR","CONFIG_NODE_ID",
};
const char * const bootrule[] = {
"$accept : input",
"input :",
"input : definition input",
"input : emptystatement input",
"input : syntax_error",
"definition : long_nodename nodegroup",
"definition : short_nodename long_nodegroup",
"short_nodename : literal",
"long_nodename : literals",
"literal : LITERAL",
"literal : CONFIG_NODE_ID LITERAL",
"literals : literals literal",
"literals : literal STRING",
"literals : literal LITERAL",
"literals : literal BOOL_VALUE",
"literals : literal UINTRANGE_VALUE",
"literals : literal UINT_VALUE",
"literals : literal IPV4RANGE_VALUE",
"literals : literal IPV4_VALUE",
"literals : literal IPV4NET_VALUE",
"literals : literal IPV6RANGE_VALUE",
"literals : literal IPV6_VALUE",
"literals : literal IPV6NET_VALUE",
"literals : literal MACADDR_VALUE",
"literals : literal URL_FILE_VALUE",
"literals : literal URL_FTP_VALUE",
"literals : literal URL_HTTP_VALUE",
"literals : literal URL_TFTP_VALUE",
"nodegroup : long_nodegroup",
"nodegroup : END",
"long_nodegroup : UPLEVEL statements DOWNLEVEL",
"statements :",
"statements : statement statements",
"statement : terminal",
"statement : definition",
"statement : emptystatement",
"emptystatement : END",
"term_literal : LITERAL",
"term_literal : CONFIG_NODE_ID LITERAL",
"terminal : term_literal END",
"terminal : term_literal INFIX_OPERATOR STRING END",
"terminal : term_literal INFIX_OPERATOR BOOL_VALUE END",
"terminal : term_literal INFIX_OPERATOR UINTRANGE_VALUE END",
"terminal : term_literal INFIX_OPERATOR UINT_VALUE END",
"terminal : term_literal INFIX_OPERATOR IPV4RANGE_VALUE END",
"terminal : term_literal INFIX_OPERATOR IPV4_VALUE END",
"terminal : term_literal INFIX_OPERATOR IPV4NET_VALUE END",
"terminal : term_literal INFIX_OPERATOR IPV6RANGE_VALUE END",
"terminal : term_literal INFIX_OPERATOR IPV6_VALUE END",
"terminal : term_literal INFIX_OPERATOR IPV6NET_VALUE END",
"terminal : term_literal INFIX_OPERATOR MACADDR_VALUE END",
"terminal : term_literal INFIX_OPERATOR URL_FILE_VALUE END",
"terminal : term_literal INFIX_OPERATOR URL_FTP_VALUE END",
"terminal : term_literal INFIX_OPERATOR URL_HTTP_VALUE END",
"terminal : term_literal INFIX_OPERATOR URL_TFTP_VALUE END",
"terminal : term_literal INFIX_OPERATOR ARITH END",
"syntax_error : SYNTAX_ERROR",
};
#endif
#ifndef YYSTYPE
typedef int YYSTYPE;
#endif
#if YYDEBUG
#include <stdio.h>
#endif
#ifdef YYSTACKSIZE
#undef YYMAXDEPTH
#define YYMAXDEPTH YYSTACKSIZE
#else
#ifdef YYMAXDEPTH
#define YYSTACKSIZE YYMAXDEPTH
#else
#define YYSTACKSIZE 10000
#define YYMAXDEPTH 10000
#endif
#endif
#define YYINITSTACKSIZE 200
int yydebug;
int yynerrs;
int yyerrflag;
int yychar;
short *yyssp;
YYSTYPE *yyvsp;
YYSTYPE yyval;
YYSTYPE yylval;
short *yyss;
short *yysslim;
YYSTYPE *yyvs;
int yystacksize;
#line 192 "boot.yy"
extern void boot_scan_string(const char *configuration);
extern int boot_linenum;
extern "C" int bootparse();
extern int bootlex();
void booterror(const char *s) throw (ParseError);
static ConfigTree *config_tree = NULL;
static string boot_filename;
static string lastsymbol;
static string node_id;
static void
extend_path(char* segment, int type, const string& node_id_str)
{
lastsymbol = segment;
string segment_copy = segment;
free(segment);
try {
ConfigNodeId config_node_id(node_id_str);
config_tree->extend_path(segment_copy, type, config_node_id);
} catch (const InvalidString& e) {
string s = c_format("Invalid config tree node ID: %s",
e.str().c_str());
booterror(s.c_str());
}
}
static void
push_path()
{
config_tree->push_path();
}
static void
pop_path()
{
config_tree->pop_path();
}
static void
terminal(char* value, int type, ConfigOperator op)
{
push_path();
lastsymbol = value;
config_tree->terminal_value(string(value), type, op);
free(value);
pop_path();
}
void
booterror(const char *s) throw (ParseError)
{
string errmsg;
if (! boot_filename.empty()) {
errmsg = c_format("PARSE ERROR [Config File %s, line %d]: %s",
boot_filename.c_str(),
boot_linenum, s);
} else {
errmsg = c_format("PARSE ERROR [line %d]: %s", boot_linenum, s);
}
errmsg += c_format("; Last symbol parsed was \"%s\"", lastsymbol.c_str());
xorp_throw(ParseError, errmsg);
}
int
init_bootfile_parser(const char *configuration,
const char *filename,
ConfigTree *ct)
{
config_tree = ct;
boot_filename = filename;
boot_linenum = 1;
boot_scan_string(configuration);
return 0;
}
void
parse_bootfile() throw (ParseError)
{
if (bootparse() != 0)
booterror("unknown error");
}
ConfigOperator boot_lookup_operator(const char* s)
{
char *s0, *s1, *s2;
/* skip leading spaces */
s0 = strdup(s);
s1 = s0;
while (*s1 != '\0' && *s1 == ' ') {
s1++;
}
/* trim trailing spaces */
s2 = s1;
while (*s2 != '\0') {
if (*s2 == ' ') {
*s2 = 0;
break;
}
s2++;
}
ConfigOperator op;
string str = s1;
free(s1);
try {
op = lookup_operator(str);
return op;
} catch (const ParseError& pe) {
string errmsg = pe.why();
errmsg += c_format("\n[Line %d]\n", boot_linenum);
errmsg += c_format("Last symbol parsed was \"%s\"", lastsymbol.c_str());
xorp_throw(ParseError, errmsg);
}
XLOG_UNREACHABLE();
}
#line 417 "y.boot_tab.c"
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
static int yygrowstack()
{
int newsize, i;
short *newss;
YYSTYPE *newvs;
if ((newsize = yystacksize) == 0)
newsize = YYINITSTACKSIZE;
else if (newsize >= YYMAXDEPTH)
return -1;
else if ((newsize *= 2) > YYMAXDEPTH)
newsize = YYMAXDEPTH;
i = yyssp - yyss;
newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
(short *)malloc(newsize * sizeof *newss);
if (newss == NULL)
return -1;
yyss = newss;
yyssp = newss + i;
newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
(YYSTYPE *)malloc(newsize * sizeof *newvs);
if (newvs == NULL)
return -1;
yyvs = newvs;
yyvsp = newvs + i;
yystacksize = newsize;
yysslim = yyss + newsize - 1;
return 0;
}
#define YYABORT goto yyabort
#define YYREJECT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
#ifndef YYPARSE_PARAM
#if defined(__cplusplus) || __STDC__
#define YYPARSE_PARAM_ARG void
#define YYPARSE_PARAM_DECL
#else /* ! ANSI-C/C++ */
#define YYPARSE_PARAM_ARG
#define YYPARSE_PARAM_DECL
#endif /* ANSI-C/C++ */
#else /* YYPARSE_PARAM */
#ifndef YYPARSE_PARAM_TYPE
#define YYPARSE_PARAM_TYPE void *
#endif
#if defined(__cplusplus) || __STDC__
#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM
#define YYPARSE_PARAM_DECL
#else /* ! ANSI-C/C++ */
#define YYPARSE_PARAM_ARG YYPARSE_PARAM
#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;
#endif /* ANSI-C/C++ */
#endif /* ! YYPARSE_PARAM */
int
yyparse (YYPARSE_PARAM_ARG)
YYPARSE_PARAM_DECL
{
register int yym, yyn, yystate;
#if YYDEBUG
register const char *yys;
if ((yys = getenv("YYDEBUG")))
{
yyn = *yys;
if (yyn >= '0' && yyn <= '9')
yydebug = yyn - '0';
}
#endif
yynerrs = 0;
yyerrflag = 0;
yychar = (-1);
if (yyss == NULL && yygrowstack()) goto yyoverflow;
yyssp = yyss;
yyvsp = yyvs;
*yyssp = yystate = 0;
yyloop:
if ((yyn = yydefred[yystate])) goto yyreduce;
if (yychar < 0)
{
if ((yychar = yylex()) < 0) yychar = 0;
#if YYDEBUG
if (yydebug)
{
yys = 0;
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
printf("%sdebug: state %d, reading %d (%s)\n",
YYPREFIX, yystate, yychar, yys);
}
#endif
}
if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: state %d, shifting to state %d\n",
YYPREFIX, yystate, yytable[yyn]);
#endif
if (yyssp >= yysslim && yygrowstack())
{
goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
*++yyvsp = yylval;
yychar = (-1);
if (yyerrflag > 0) --yyerrflag;
goto yyloop;
}
if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
{
yyn = yytable[yyn];
goto yyreduce;
}
if (yyerrflag) goto yyinrecovery;
#if defined(lint) || defined(__GNUC__)
goto yynewerror;
#endif
yynewerror:
yyerror("syntax error");
#if defined(lint) || defined(__GNUC__)
goto yyerrlab;
#endif
yyerrlab:
++yynerrs;
yyinrecovery:
if (yyerrflag < 3)
{
yyerrflag = 3;
for (;;)
{
if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: state %d, error recovery shifting\
to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
#endif
if (yyssp >= yysslim && yygrowstack())
{
goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
*++yyvsp = yylval;
goto yyloop;
}
else
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: error recovery discarding state %d\n",
YYPREFIX, *yyssp);
#endif
if (yyssp <= yyss) goto yyabort;
--yyssp;
--yyvsp;
}
}
}
else
{
if (yychar == 0) goto yyabort;
#if YYDEBUG
if (yydebug)
{
yys = 0;
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
YYPREFIX, yystate, yychar, yys);
}
#endif
yychar = (-1);
goto yyloop;
}
yyreduce:
#if YYDEBUG
if (yydebug)
printf("%sdebug: state %d, reducing by rule %d (%s)\n",
YYPREFIX, yystate, yyn, yyrule[yyn]);
#endif
yym = yylen[yyn];
yyval = yyvsp[1-yym];
switch (yyn)
{
case 7:
#line 60 "boot.yy"
{ push_path(); }
break;
case 8:
#line 63 "boot.yy"
{ push_path(); }
break;
case 9:
#line 66 "boot.yy"
{ node_id = ""; extend_path(yyvsp[0], NODE_VOID, node_id); }
break;
case 10:
#line 67 "boot.yy"
{ node_id = yyvsp[-1];
free(yyvsp[-1]);
extend_path(yyvsp[0], NODE_VOID, node_id); }
break;
case 12:
#line 73 "boot.yy"
{ extend_path(yyvsp[0], NODE_TEXT, node_id); }
break;
case 13:
#line 74 "boot.yy"
{ extend_path(yyvsp[0], NODE_TEXT, node_id); }
break;
case 14:
#line 75 "boot.yy"
{ extend_path(yyvsp[0], NODE_BOOL, node_id); }
break;
case 15:
#line 76 "boot.yy"
{ extend_path(yyvsp[0], NODE_UINTRANGE, node_id); }
break;
case 16:
#line 77 "boot.yy"
{ extend_path(yyvsp[0], NODE_UINT, node_id); }
break;
case 17:
#line 78 "boot.yy"
{ extend_path(yyvsp[0], NODE_IPV4RANGE, node_id); }
break;
case 18:
#line 79 "boot.yy"
{ extend_path(yyvsp[0], NODE_IPV4, node_id); }
break;
case 19:
#line 80 "boot.yy"
{ extend_path(yyvsp[0], NODE_IPV4NET, node_id); }
break;
case 20:
#line 81 "boot.yy"
{ extend_path(yyvsp[0], NODE_IPV6RANGE, node_id); }
break;
case 21:
#line 82 "boot.yy"
{ extend_path(yyvsp[0], NODE_IPV6, node_id); }
break;
case 22:
#line 83 "boot.yy"
{ extend_path(yyvsp[0], NODE_IPV6NET, node_id); }
break;
case 23:
#line 84 "boot.yy"
{ extend_path(yyvsp[0], NODE_MACADDR, node_id); }
break;
case 24:
#line 85 "boot.yy"
{ extend_path(yyvsp[0], NODE_URL_FILE, node_id); }
break;
case 25:
#line 86 "boot.yy"
{ extend_path(yyvsp[0], NODE_URL_FTP, node_id); }
break;
case 26:
#line 87 "boot.yy"
{ extend_path(yyvsp[0], NODE_URL_HTTP, node_id); }
break;
case 27:
#line 88 "boot.yy"
{ extend_path(yyvsp[0], NODE_URL_TFTP, node_id); }
break;
case 29:
#line 92 "boot.yy"
{ pop_path(); }
break;
case 30:
#line 95 "boot.yy"
{ pop_path(); }
break;
case 37:
#line 110 "boot.yy"
{ node_id = ""; extend_path(yyvsp[0], NODE_VOID, node_id); }
break;
case 38:
#line 111 "boot.yy"
{ node_id = yyvsp[-1];
free(yyvsp[-1]);
extend_path(yyvsp[0], NODE_VOID, node_id);}
break;
case 39:
#line 116 "boot.yy"
{
terminal(strdup(""), NODE_VOID, OP_NONE);
}
break;
case 40:
#line 119 "boot.yy"
{
terminal(yyvsp[-1], NODE_TEXT, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 41:
#line 123 "boot.yy"
{
terminal(yyvsp[-1], NODE_BOOL, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 42:
#line 127 "boot.yy"
{
terminal(yyvsp[-1], NODE_UINTRANGE, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 43:
#line 131 "boot.yy"
{
terminal(yyvsp[-1], NODE_UINT, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 44:
#line 135 "boot.yy"
{
terminal(yyvsp[-1], NODE_IPV4RANGE, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 45:
#line 139 "boot.yy"
{
terminal(yyvsp[-1], NODE_IPV4, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 46:
#line 143 "boot.yy"
{
terminal(yyvsp[-1], NODE_IPV4NET, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 47:
#line 147 "boot.yy"
{
terminal(yyvsp[-1], NODE_IPV6RANGE, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 48:
#line 151 "boot.yy"
{
terminal(yyvsp[-1], NODE_IPV6, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 49:
#line 155 "boot.yy"
{
terminal(yyvsp[-1], NODE_IPV6NET, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 50:
#line 159 "boot.yy"
{
terminal(yyvsp[-1], NODE_MACADDR, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 51:
#line 163 "boot.yy"
{
terminal(yyvsp[-1], NODE_URL_FILE, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 52:
#line 167 "boot.yy"
{
terminal(yyvsp[-1], NODE_URL_FTP, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 53:
#line 171 "boot.yy"
{
terminal(yyvsp[-1], NODE_URL_HTTP, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 54:
#line 175 "boot.yy"
{
terminal(yyvsp[-1], NODE_URL_TFTP, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 55:
#line 179 "boot.yy"
{
terminal(yyvsp[-1], NODE_ARITH, boot_lookup_operator(yyvsp[-2]));
free(yyvsp[-2]);
}
break;
case 56:
#line 185 "boot.yy"
{
booterror("syntax error");
}
break;
#line 836 "y.boot_tab.c"
}
yyssp -= yym;
yystate = *yyssp;
yyvsp -= yym;
yym = yylhs[yyn];
if (yystate == 0 && yym == 0)
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: after reduction, shifting from state 0 to\
state %d\n", YYPREFIX, YYFINAL);
#endif
yystate = YYFINAL;
*++yyssp = YYFINAL;
*++yyvsp = yyval;
if (yychar < 0)
{
if ((yychar = yylex()) < 0) yychar = 0;
#if YYDEBUG
if (yydebug)
{
yys = 0;
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
printf("%sdebug: state %d, reading %d (%s)\n",
YYPREFIX, YYFINAL, yychar, yys);
}
#endif
}
if (yychar == 0) goto yyaccept;
goto yyloop;
}
if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
yystate = yytable[yyn];
else
yystate = yydgoto[yym];
#if YYDEBUG
if (yydebug)
printf("%sdebug: after reduction, shifting from state %d \
to state %d\n", YYPREFIX, *yyssp, yystate);
#endif
if (yyssp >= yysslim && yygrowstack())
{
goto yyoverflow;
}
*++yyssp = yystate;
*++yyvsp = yyval;
goto yyloop;
yyoverflow:
yyerror("yacc stack overflow");
yyabort:
return (1);
yyaccept:
return (0);
}
syntax highlighted by Code2HTML, v. 0.9.1