pike.git/
src/
language.yacc
Branch:
Tag:
Non-build tags
All tags
No tags
1996-11-03
1996-11-03 06:23:46 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
7e5057767d4e436a042f0f340262e145c11ac1ee (
1447
lines) (+
754
/-
693
)
[
Show
|
Annotate
]
Branch:
7.9
if(int i) implemeved
Rev: src/language.yacc:1.4
213:
} %type <fnum> F_FLOAT
-
%type <
number
>
modifiers modifier optional
_
dot_dot_dot
-
%type <
number
>
assign
F_
NUMBER F_LOCAL arguments arguments2
-
%type <
number
>
optional_stars
modifier
_
list
-
%type <string>
F_IDENTIFIER F_STRING string_constant
low_string
-
%type <string> optional_identifier
cast simple_type
+
+
%type <
string
>
F
_
IDENTIFIER
+
%type <
string
> F_
STRING
+
%type <
string
>
cast
simple
_
type
+
%type <string> low_string
+
%type <string> optional_identifier
%type <string> optional_rename_inherit
-
+
%type <string> string_constant
-
%type <number> F_ARRAY_ID F_BREAK F_CASE F_CATCH F_CONTINUE F_DEFAULT F_DO
-
%type <number> F_
PREDEF F_
ELSE F_FLOAT_ID F_FOR F_FOREACH F_FUNCTION_ID F_GAUGE
-
%type <number> F_IF F_INHERIT F_INLINE F_INT_ID F_LAMBDA F_
MULTISET_ID
F_MAPPING_ID
-
%type <number> F_MIXED_ID F_NO_MASK F_OBJECT_ID F_PRIVATE F_PROGRAM_ID
-
%type <number> F_PROTECTED F_PUBLIC F_RETURN F_SSCANF F_STATIC
-
%type <number> F_STRING_ID F_SWITCH F_VARARGS F_VOID_ID F_WHILE
+
%type <number> F_ARRAY_ID
+
%type
<number>
F_BREAK
+
%type
<number>
F_CASE
+
%type
<number>
F_CATCH
+
%type
<number>
F_CONTINUE
+
%type
<number>
F_DEFAULT
+
%type
<number>
F_DO
+
%type <number> F_ELSE
+
%type
<number>
F_FLOAT_ID
+
%type
<number>
F_FOR
+
%type
<number>
F_FOREACH
+
%type
<number>
F_FUNCTION_ID
+
%type
<number>
F_GAUGE
+
%type <number> F_IF
+
%type
<number>
F_INHERIT
+
%type
<number>
F_INLINE
+
%type
<number>
F_INT_ID
+
%type
<number>
F_LAMBDA
+
%type
<number>
F_
LOCAL
+
%type
<number>
F_MAPPING_ID
+
%type <number> F_MIXED_ID
+
%type
<number>
F_
MULTISET_ID
+
%type <number> F_
NO_MASK
+
%type
<number>
F_
NUMBER
+
%type <number> F_
OBJECT_ID
+
%type
<number>
F_
PREDEF
+
%type <number> F_
PRIVATE
+
%type
<number>
F_PROGRAM_ID
+
%type <number> F_PROTECTED
+
%type
<number>
F_PUBLIC
+
%type
<number>
F_RETURN
+
%type
<number>
F_SSCANF
+
%type
<number>
F_STATIC
+
%type <number> F_STRING_ID
+
%type
<number>
F_SWITCH
+
%type
<number>
F_VARARGS
+
%type
<number>
F_VOID_ID
+
%type
<number>
F_WHILE
+
%type <number> arguments
+
%type <number> arguments2
+
%type <number> assign
+
%type <number> modifier
+
%type <number> modifier_list
+
%type <number> modifiers
+
%type <number> optional_dot_dot_dot
+
%type <number> optional_stars
/* The following symbos return type information */
-
%type <n>
string
expr01
expr00
comma_expr comma_expr_or_zero
-
%type <n>
expr2
expr1 expr3 expr0 expr4
catch
lvalue
_list
-
%type <n>
lambda
for_expr
block
assoc_pair
new_
local_name
-
%type <n>
expr
_
list2
m_expr_list m_expr_list2
statement
gauge sscanf
-
%type <n>
for do cond
optional_else_part
while
statements
-
%type <n>
local_name_list
class
catch_arg comma_expr_or_maxint
-
%type <n>
unused2
foreach
unused
switch
case
return
expr_list
default
-
%type <n>
continue
break
block_or_semi typeof
+
%type <n>
assoc_pair
+
%type
<n>
block
+
%type
<n> block_or_semi
+
%type <n> break
+
%type <n> case
+
%type <n> catch
+
%type <n> catch_arg
+
%type <n> class
+
%type <n>
comma_expr
+
%type
<n>
comma_
expr2
+
%type <n> comma_
expr_or_
maxint
+
%type <n> comma_expr_or_
zero
+
%type <n>
cond
+
%type
<n> continue
+
%type <n> default
+
%type <n> do
+
%type <n> expr00
+
%type <n> expr01
+
%type <n>
expr1
+
%type
<n> expr2
+
%type <n>
expr3 expr0
+
%type
<n>
expr4
+
%type
<n>
expr
_list
+
%type <n>
expr_list2
+
%type
<n>
for
+
%type <n> for
_expr
+
%type
<n>
foreach
+
%type
<n>
gauge
+
%type <n> lambda
+
%type <n>
local_name
_list
+
%type <n>
lvalue
_
list
+
%type
<n>
m_expr_list
+
%type
<n>
m_expr_list2
+
%type
<n>
new_local_name
+
%type <n> optional_else_part
+
%type
<n>
return
+
%type <n>
sscanf
+
%type
<n>
statement
+
%type
<n> statements
+
%type <n>
string
+
%type
<n>
switch
+
%type
<n>
typeof
+
%type
<n>
unused
+
%type <n>
unused2
+
%type
<n>
while
%% all: program; program: program def optional_semi_colon
-
| /* empty */ ;
+
| /* empty */
+
;
optional_semi_colon: /* empty */
-
| ';' { yyerror("Extra ';'. Ignored."); };
+
| ';' { yyerror("Extra ';'. Ignored."); }
+
;
string_constant: low_string | string_constant '+' low_string
263:
inheritance: modifiers F_INHERIT string_constant optional_rename_inherit ';' { simple_do_inherit($3,$1,$4);
-
}
;
+
}
+
;
-
block_or_semi: block { $$ = mknode(F_ARG_LIST,$1,mknode(F_RETURN,mkintnode(0),0)); }
+
block_or_semi: block
+
{
+
$$ = mknode(F_ARG_LIST,$1,mknode(F_RETURN,mkintnode(0),0));
+
}
| ';' { $$ = NULL;} ; type_or_error: simple_type {
-
if(local_variables->current_type) free_string(local_variables->current_type);
+
if(local_variables->current_type)
+
free_string(local_variables->current_type);
local_variables->current_type=$1; } | /* empty */
375:
{ reset_type_stack(); if(num_parse_error>5) YYACCEPT;
-
} ;
+
}
+
;
optional_dot_dot_dot: F_DOT_DOT_DOT { $$=1; }
401:
$3->str); add_local_name($3, pop_type());
-
}
;
+
}
+
;
arguments: /* empty */ optional_comma { $$=0; } | arguments2 optional_comma { $$=$1; }
420:
| F_INLINE { $$ = ID_INLINE | ID_NOMASK; } ;
-
modifiers: modifier_list { $$=current_modifiers=$1; }
+
modifiers: modifier_list { $$=current_modifiers=$1; }
;
modifier_list: /* empty */ { $$ = 0; }
-
| modifier modifier_list
-
{
-
$$ = $1 | $2;
-
}
+
| modifier modifier_list { $$ = $1 | $2; }
; optional_stars: optional_stars '*' { $$=$1 + 1; }
463:
type_stack_mark(); type_stack_mark(); }
-
function_type_list
-
optional_dot_dot_dot
-
':'
+
function_type_list optional_dot_dot_dot ':'
{ if ($4) {
483:
type_stack_reverse(); type_stack_reverse(); }
-
|
{
+
|
/*
empty
*/
+
{
push_type(T_MIXED); push_type(T_MIXED); push_type(T_MANY);
-
}
;
+
}
+
;
function_type_list: /* Empty */ optional_comma | function_type_list2 optional_comma
522:
type_stack_reverse(); } ')'
-
|
{
+
|
/*
empty
*/
+
{
push_type(T_MIXED); push_type(T_MIXED); }
531:
name_list: new_name
-
| name_list ',' new_name;
+
| name_list ',' new_name
+
;
new_name: optional_stars F_IDENTIFIER {
555:
expr0 { init_node=mknode(F_ARG_LIST,init_node,
-
mkcastnode(void_type_string, mknode(F_ASSIGN,$5,mkidentifiernode($<number>4))));
+
mkcastnode(void_type_string,
+
mknode(F_ASSIGN,$5,
+
mkidentifiernode($<number>4))));
free_string($2);
-
} ;
+
}
+
;
new_local_name: optional_stars F_IDENTIFIER
565:
push_finished_type(local_variables->current_type); while($1--) push_type(T_ARRAY); add_local_name($2, pop_type());
-
$$=
mkcastnode(void_type_string,
-
mknode(F_ASSIGN,mkintnode(0),
-
mklocalnode(islocal($2)))
)
;
+
$$=mknode(F_ASSIGN,mkintnode(0), mklocalnode(islocal($2)));
} | optional_stars F_IDENTIFIER '=' expr0 { push_finished_type(local_variables->current_type); while($1--) push_type(T_ARRAY); add_local_name($2, pop_type());
-
$$=
mkcastnode(void_type_string,
-
mknode(F_ASSIGN,$4,
-
mklocalnode(islocal($2)))
)
;
+
$$=mknode(F_ASSIGN,$4,mklocalnode(islocal($2)));
+
}
+
;
-
};
+
-
+
block:'{' { $<number>$=local_variables->current_number_of_locals; }
-
statements
-
'}'
+
statements '}'
{ while(local_variables->current_number_of_locals > $<number>2) {
596:
free_string(local_variables->variable[e].type); } $$=$3;
-
} ;
+
}
+
;
local_name_list: new_local_name
-
| local_name_list ',' new_local_name
-
{
-
$$=mknode(F_ARG_LIST,$1,$3);
-
}
+
| local_name_list ',' new_local_name { $$=mknode(F_ARG_LIST,$1,$3); }
; statements: { $$=0; }
613:
; statement: unused2 ';' { $$=$1; }
-
| simple_type
-
{
-
if(local_variables->current_type) free_string(local_variables->current_type);
-
local_variables->current_type=$1;
-
} local_name_list ';' { $$=$3; }
+
| cond | while | do
704:
free_string(type); pop_locals(); $$=mkidentifiernode(f);
-
} ;
+
}
+
;
class: F_CLASS '{' { start_new_program(); }
-
program
-
'}'
+
program '}'
{ struct svalue s; s.u.program=end_program();
726:
} $$=mksvaluenode(&s); free_svalue(&s);
-
} ;
+
}
+
;
-
cond: F_IF '(' comma_expr ')'
-
statement
-
optional_else_part
+
cond: F_IF '(' comma_expr ')' statement optional_else_part
{ $$=mknode('?',$3,mknode(':',$5,$6)); $$->line_number=$1;
743:
| F_ELSE statement { $$=$2; } ;
-
foreach: F_FOREACH '(' expr0 ',' expr4 ')'
-
statement
+
foreach: F_FOREACH '(' expr0 ',' expr4 ')' statement
{ $$=mknode(F_FOREACH,mknode(F_VAL_LVAL,$3,$5),$7); $$->line_number=$1;
-
} ;
+
}
+
;
do: F_DO statement F_WHILE '(' comma_expr ')' ';' { $$=mknode(F_DO,$2,$5); $$->line_number=$1;
-
} ;
+
}
+
;
-
-
for: F_FOR '(' unused ';' for_expr ';' unused ')'
-
statement
+
for: F_FOR '(' unused ';' for_expr ';' unused ')' statement
{ int i=current_line; current_line=$1; $$=mknode(F_ARG_LIST,mkcastnode(void_type_string,$3),mknode(F_FOR,$5,mknode(':',$9,$7))); current_line=i;
-
} ;
+
}
+
;
-
while: F_WHILE '(' comma_expr ')'
-
statement
+
while: F_WHILE '(' comma_expr ')' statement
{ int i=current_line; current_line=$1; $$=mknode(F_FOR,$3,mknode(':',$5,NULL)); current_line=i;
-
} ;
+
}
+
;
for_expr: /* EMPTY */ { $$=mkintnode(1); }
-
| comma_expr;
+
| comma_expr
+
;
-
switch: F_SWITCH '(' comma_expr ')'
-
statement
+
switch: F_SWITCH '(' comma_expr ')' statement
{ $$=mknode(F_SWITCH,$3,$5); $$->line_number=$1;
-
} ;
+
}
+
;
case: F_CASE comma_expr ':' {
808:
| F_RETURN comma_expr { $$=mknode(F_RETURN,$2,0);
-
}
;
+
}
+
;
unused: { $$=0; } | unused2 ;
-
unused2: comma_expr
+
unused2: comma_expr
{ $$=mkcastnode(void_type_string,$1); } ;
+
+
comma_expr: comma_expr2
+
| type2
{
-
$$=mkcastnode
(
void
_
type
_
string,$1
);
-
}
+
if(local_variables->current_type)
+
free_string
(
local
_
variables->current_
type
);
+
local
_
variables->current_type=pop_type(
);
+
}
local_name_list
{
$$=$3;
}
;
-
comma_
expr
: expr0
-
|
unused2
',' expr0
+
+
comma_
expr2
: expr0
+
|
comma_expr2
',' expr0
{ $$ = mknode(F_ARG_LIST,mkcastnode(void_type_string,$1),$3); } ; expr00: expr0
-
| '@' expr0
-
{
-
$$=mknode(F_PUSH_ARRAY,$2,0);
-
};
+
| '@' expr0 { $$=mknode(F_PUSH_ARRAY,$2,0); };
expr0: expr01
-
| expr4 '=' expr0
-
{
-
$$=mknode(F_ASSIGN,$3,$1);
-
}
-
| expr4 assign expr0
-
{
-
$$=mknode($2,$1,$3);
-
}
-
| error assign expr01
-
{
-
$$=0;
-
}
;
+
| expr4 '=' expr0 { $$=mknode(F_ASSIGN,$3,$1); }
+
| expr4 assign expr0 { $$=mknode($2,$1,$3); }
+
| error assign expr01 { $$=0;
}
+
;
expr01: expr1 { $$ = $1; }
-
| expr1 '?' expr01 ':' expr01
-
{
-
$$=mknode('?',$1,mknode(':',$3,$5));
-
}
;
+
| expr1 '?' expr01 ':' expr01 { $$=mknode('?',$1,mknode(':',$3,$5));
}
+
;
assign: F_AND_EQ { $$=F_AND_EQ; } | F_OR_EQ { $$=F_OR_EQ; }
884:
| m_expr_list2 ',' assoc_pair { $$=mknode(F_ARG_LIST,$1,$3); } ;
-
assoc_pair: expr0 ':' expr1
-
{
-
$$=mknode(F_ARG_LIST,$1,$3);
-
} ;
+
assoc_pair: expr0 ':' expr1 { $$=mknode(F_ARG_LIST,$1,$3); } ;
expr1: expr2 | expr1 F_LOR expr1 { $$=mknode(F_LOR,$1,$3); }
973:
{ $$=mknode(F_RANGE,$1,mknode(F_ARG_LIST,$3,$5)); }
-
| '(' comma_
expr
')' { $$=$2; }
+
| '(' comma_
expr2
')' { $$=$2; }
| '(' '{' expr_list '}' ')' { $$=mkefuncallnode("aggregate",$3); } | '(' '[' m_expr_list ']' ')'
1063:
| block ;
-
catch: F_CATCH catch_arg
-
{
-
$$=mknode(F_CATCH,$2,NULL);
-
} ;
+
catch: F_CATCH catch_arg { $$=mknode(F_CATCH,$2,NULL); } ;
sscanf: F_SSCANF '(' expr0 ',' expr0 lvalue_list ')' { $$=mknode(F_SSCANF,mknode(F_ARG_LIST,$3,$5),$6); }
-
+
;
-
+
lvalue_list: /* empty */ { $$ = 0; }
-
| ',' expr4 lvalue_list
-
{
-
$$ = mknode(F_LVALUE_LIST,$2,$3);
-
} ;
+
| ',' expr4 lvalue_list { $$ = mknode(F_LVALUE_LIST,$2,$3);
}
+
;
low_string: F_STRING | low_string F_STRING
1089:
} ;
-
string: low_string
-
{
-
$$=mkstrnode($1);
-
free_string($1);
-
} ;
+
string: low_string { $$=mkstrnode($1); free_string($1); } ;
%%