215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | /*\
||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
||| See the files COPYING and DISCLAIMER for more information.
\*/
%pure_parser
/*
* These values are used by the stack machine, and can not be directly
* called from Pike.
*/
|
720215 | 1998-04-29 | Fredrik Hübinette (Hubbe) | | %token F_OFFSET
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_PREFIX_256 F_PREFIX_512 F_PREFIX_768 F_PREFIX_1024
%token F_PREFIX_CHARX256 F_PREFIX_WORDX256 F_PREFIX_24BITX256
|
fe574a | 1998-11-16 | Fredrik Hübinette (Hubbe) | | %token F_POP_VALUE F_POP_N_ELEMS F_MARK F_MARK2 F_MARK_X F_POP_MARK
%token F_LDA F_CALL_LFUN F_CALL_LFUN_AND_POP F_CALL_LFUN_AND_RETURN
|
3c04e8 | 1997-03-13 | Fredrik Hübinette (Hubbe) | | %token F_APPLY F_APPLY_AND_POP F_MARK_APPLY F_MARK_APPLY_POP
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | %token F_APPLY_AND_RETURN F_MARK_AND_STRING
%token F_APPLY_ASSIGN_LOCAL F_APPLY_ASSIGN_LOCAL_AND_POP
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
%token F_BRANCH F_BRANCH_WHEN_ZERO F_BRANCH_WHEN_NON_ZERO
|
596e36 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | %token F_BRANCH_AND_POP_WHEN_ZERO F_BRANCH_AND_POP_WHEN_NON_ZERO
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_BRANCH_WHEN_LT F_BRANCH_WHEN_GT
%token F_BRANCH_WHEN_LE F_BRANCH_WHEN_GE
%token F_BRANCH_WHEN_EQ F_BRANCH_WHEN_NE
|
a7538d | 1998-05-12 | Fredrik Hübinette (Hubbe) | | %token F_BRANCH_IF_LOCAL F_BRANCH_IF_NOT_LOCAL
%token F_BRANCH_IF_NOT_LOCAL_ARROW
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_INC_LOOP F_DEC_LOOP
%token F_INC_NEQ_LOOP F_DEC_NEQ_LOOP
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | %token F_LEXICAL_LOCAL F_LEXICAL_LOCAL_LVALUE
|
dffa01 | 1997-01-15 | Fredrik Hübinette (Hubbe) | | %token F_INDEX F_ARROW F_INDIRECT F_STRING_INDEX F_LOCAL_INDEX
|
a7538d | 1998-05-12 | Fredrik Hübinette (Hubbe) | | %token F_LOCAL_LOCAL_INDEX F_LOCAL_ARROW F_GLOBAL_LOCAL_INDEX
|
624f57 | 1999-03-11 | Fredrik Hübinette (Hubbe) | | %token F_POS_INT_INDEX F_NEG_INT_INDEX F_MAGIC_INDEX F_MAGIC_SET_INDEX
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_LTOSVAL F_LTOSVAL2
%token F_PUSH_ARRAY
%token F_RANGE F_COPY_VALUE
/*
* Basic value pushing
*/
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | %token F_LFUN F_TRAMPOLINE
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | %token F_GLOBAL F_GLOBAL_LVALUE
%token F_LOCAL F_2_LOCALS F_LOCAL_LVALUE F_MARK_AND_LOCAL
%token F_EXTERNAL F_EXTERNAL_LVALUE
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | %token F_CLEAR_LOCAL F_CLEAR_2_LOCAL F_CLEAR_4_LOCAL
%token F_CLEAR_STRING_SUBTYPE
|
dffa01 | 1997-01-15 | Fredrik Hübinette (Hubbe) | | %token F_CONSTANT F_FLOAT F_STRING F_ARROW_STRING
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_NUMBER F_NEG_NUMBER F_CONST_1 F_CONST0 F_CONST1 F_BIGNUM
|
ece320 | 1999-08-02 | Fredrik Hübinette (Hubbe) | | %token F_UNDEFINED
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | /*
* These are the predefined functions that can be accessed from Pike.
*/
%token F_INC F_DEC F_POST_INC F_POST_DEC F_INC_AND_POP F_DEC_AND_POP
%token F_INC_LOCAL F_INC_LOCAL_AND_POP F_POST_INC_LOCAL
%token F_DEC_LOCAL F_DEC_LOCAL_AND_POP F_POST_DEC_LOCAL
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | %token F_RETURN F_DUMB_RETURN F_RETURN_0 F_RETURN_1 F_RETURN_LOCAL
%token F_THROW_ZERO
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
%token F_ASSIGN F_ASSIGN_AND_POP
%token F_ASSIGN_LOCAL F_ASSIGN_LOCAL_AND_POP
%token F_ASSIGN_GLOBAL F_ASSIGN_GLOBAL_AND_POP
|
a7538d | 1998-05-12 | Fredrik Hübinette (Hubbe) | | %token F_LOCAL_2_LOCAL F_LOCAL_2_GLOBAL F_GLOBAL_2_LOCAL
|
3c04e8 | 1997-03-13 | Fredrik Hübinette (Hubbe) | | %token F_ADD F_SUBTRACT F_ADD_INT F_ADD_NEG_INT
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | %token F_ADD_TO_AND_POP
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_MULTIPLY F_DIVIDE F_MOD
%token F_LT F_GT F_EQ F_GE F_LE F_NE
%token F_NEGATE F_NOT F_COMPL
%token F_AND F_OR F_XOR
%token F_LSH F_RSH
%token F_LAND F_LOR
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | %token F_EQ_OR F_EQ_AND
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
%token F_SWITCH F_SSCANF F_CATCH
%token F_CAST
%token F_FOREACH
%token F_SIZEOF F_SIZEOF_LOCAL
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | %token F_CALL_FUNCTION F_CALL_FUNCTION_AND_RETURN
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
/*
* These are token values that needn't have an associated code for the
* compiled file
*/
|
a7538d | 1998-05-12 | Fredrik Hübinette (Hubbe) | | %token F_MAX_OPCODE
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | /* This is the end of file marker used by the lexer
* to enable nicer EOF in error handling.
*/
%token F_LEX_EOF
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_ADD_EQ
%token F_AND_EQ
%token F_ARG_LIST
%token F_ARRAY_ID
%token F_BREAK
%token F_CASE
%token F_CLASS
%token F_COLON_COLON
%token F_COMMA
%token F_CONTINUE
%token F_DEFAULT
%token F_DIV_EQ
%token F_DO
%token F_DOT_DOT
%token F_DOT_DOT_DOT
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | %token F_REDEF
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_EFUN_CALL
%token F_ELSE
%token F_FLOAT_ID
%token F_FOR
%token F_FUNCTION_ID
%token F_GAUGE
%token F_IDENTIFIER
%token F_IF
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | %token F_IMPORT
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_INHERIT
%token F_INLINE
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | %token F_LOCAL_ID
%token F_FINAL_ID
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_INT_ID
%token F_LAMBDA
%token F_MULTISET_ID
%token F_MULTISET_END
%token F_MULTISET_START
%token F_LOCAL
%token F_LSH_EQ
%token F_LVALUE_LIST
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | %token F_ARRAY_LVALUE
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_MAPPING_ID
%token F_MIXED_ID
%token F_MOD_EQ
%token F_MULT_EQ
%token F_NO_MASK
%token F_OBJECT_ID
%token F_OR_EQ
%token F_PRIVATE
%token F_PROGRAM_ID
%token F_PROTECTED
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | %token F_PREDEF
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %token F_PUBLIC
%token F_RSH_EQ
%token F_STATIC
%token F_STATUS
%token F_STRING_ID
%token F_SUBSCRIPT
%token F_SUB_EQ
%token F_TYPEOF
%token F_VAL_LVAL
%token F_VOID_ID
%token F_WHILE
%token F_XOR_EQ
|
89c549 | 1997-03-04 | Fredrik Hübinette (Hubbe) | | %token F_NOP
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | %token F_UNDEFINED
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
%token F_ALIGN
%token F_POINTER
%token F_LABEL
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | | %token F_BYTE
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | %token F_DATA
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
%token F_MAX_INSTR
%right '='
%right '?'
%left F_LOR
%left F_LAND
%left '|'
%left '^'
%left '&'
%left F_EQ F_NE
%left '>' F_GE '<' F_LE /* nonassoc? */
%left F_LSH F_RSH
%left '+' '-'
|
413c8e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | %left '*' '%' '/'
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %right F_NOT '~'
%nonassoc F_INC F_DEC
%{
/* This is the grammar definition of Pike. */
#include "global.h"
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | RCSID("$Id: language.yacc,v 1.129 1999/11/04 02:35:30 grubba Exp $");
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_MEMORY_H
#include <memory.h>
#endif
#include "interpret.h"
#include "array.h"
#include "object.h"
#include "stralloc.h"
#include "las.h"
#include "interpret.h"
#include "program.h"
#include "pike_types.h"
#include "constants.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | #include "error.h"
#include "docode.h"
|
4868db | 1997-05-07 | Per Hedbor | | #include "machine.h"
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | #define YYMAXDEPTH 1000
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | #ifndef YYDEBUG
/* May also be defined by machine.h */
|
189fd0 | 1997-01-28 | Fredrik Hübinette (Hubbe) | | #define YYDEBUG 1
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | #endif /* YYDEBUG */
|
189fd0 | 1997-01-28 | Fredrik Hübinette (Hubbe) | | #endif
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | void add_local_name(struct pike_string *,struct pike_string *);
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | static node *lexical_islocal(struct pike_string *);
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
static int varargs;
static INT32 current_modifiers;
|
8d7bda | 1997-02-10 | Fredrik Hübinette (Hubbe) | | static struct pike_string *last_identifier=0;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
cd89d7 | 1997-09-10 | Henrik Grubbström (Grubba) | | /*
* Kludge for Bison not using prototypes.
*/
#ifndef __GNUC__
#ifndef __cplusplus
|
903e82 | 1997-09-11 | Henrik Grubbström (Grubba) | | static void __yy_memcpy(char *to, char *from, int count);
|
cd89d7 | 1997-09-10 | Henrik Grubbström (Grubba) | | #endif /* !__cplusplus */
#endif /* !__GNUC__ */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %}
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %union
{
int number;
FLOAT_TYPE fnum;
struct node_s *n;
}
|
4b974c | 1999-02-20 | Henrik Grubbström (Grubba) | | %{
/* Needs to be included after YYSTYPE is defined. */
#include "lex.h"
%}
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | %{
|
7ee380 | 1998-11-10 | Henrik Grubbström (Grubba) | | /* Include <stdio.h> our selves, so that we can do our magic
* without being disturbed... */
#include <stdio.h>
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | int yylex(YYSTYPE *yylval);
|
7ee380 | 1998-11-10 | Henrik Grubbström (Grubba) | | /* Bison is stupid, and tries to optimize for space... */
#ifdef YYBISON
#define short int
#endif /* YYBISON */
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | %}
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %type <fnum> F_FLOAT
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %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_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_VOID_ID
%type <number> F_WHILE
%type <number> arguments
%type <number> arguments2
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | %type <number> func_args
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <number> assign
%type <number> modifier
%type <number> modifier_list
%type <number> modifiers
%type <number> optional_dot_dot_dot
%type <number> optional_stars
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* The following symbols return type information */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | %type <n> number_or_minint
%type <n> number_or_maxint
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | %type <n> cast
%type <n> simple_type
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | %type <n> simple_type2
%type <n> simple_identifier_type
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | %type <n> string_constant
%type <n> string
%type <n> F_STRING
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | %type <n> F_NUMBER
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | %type <n> optional_rename_inherit
%type <n> optional_identifier
%type <n> F_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> assoc_pair
%type <n> block
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | %type <n> failsafe_block
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> block_or_semi
%type <n> break
%type <n> case
%type <n> catch
%type <n> catch_arg
%type <n> class
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | %type <n> safe_comma_expr
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %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
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | %type <n> safe_expr0
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %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
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | %type <n> idents
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> lambda
%type <n> local_name_list
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | %type <n> local_name_list2
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | %type <n> low_idents
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | %type <n> safe_lvalue
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> lvalue
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> lvalue_list
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | %type <n> low_lvalue_list
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> m_expr_list
%type <n> m_expr_list2
%type <n> new_local_name
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | %type <n> new_local_name2
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | %type <n> optional_else_part
%type <n> return
%type <n> sscanf
%type <n> statement
%type <n> statements
%type <n> switch
%type <n> typeof
%type <n> unused
%type <n> unused2
%type <n> while
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | %type <n> optional_comma_expr
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | %type <n> low_program_ref
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %%
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | all: program { YYACCEPT; }
| program F_LEX_EOF { YYACCEPT; }
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | /* | error F_LEX_EOF { YYABORT; } */
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
program: program def optional_semi_colon
|
bdacd9 | 1998-04-15 | Henrik Grubbström (Grubba) | | /* | error { yyerrok; } */
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | /* empty */
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
optional_semi_colon: /* empty */
|
3301d2 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | | ';'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | string_constant: string
| string_constant '+' string
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | struct pike_string *a,*b;
copy_shared_string(a,$1->u.sval.u.string);
copy_shared_string(b,$3->u.sval.u.string);
free_node($1);
free_node($3);
a=add_and_free_shared_strings(a,b);
$$=mkstrnode(a);
free_string(a);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
optional_rename_inherit: ':' F_IDENTIFIER { $$=$2; }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | ':' bad_identifier { $$=0; }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | ':' error { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | { $$=0; }
;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | |
|
66c236 | 1998-08-29 | Henrik Grubbström (Grubba) | | /* NOTE: This rule pushes a string "name" on the stack in addition
* to resolving the program reference.
*/
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | low_program_ref: string_constant
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | ref_push_string($1->u.sval.u.string);
ref_push_string($1->u.sval.u.string);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | ref_push_string(lex.current_file);
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | |
if (error_handler && error_handler->prog) {
ref_push_object(error_handler);
SAFE_APPLY_MASTER("handle_inherit", 3);
} else {
SAFE_APPLY_MASTER("handle_inherit", 2);
}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | |
if(sp[-1].type != T_PROGRAM)
|
66c236 | 1998-08-29 | Henrik Grubbström (Grubba) | | my_yyerror("Couldn't cast string \"%s\" to program",
$1->u.sval.u.string->str);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | $$=mksvaluenode(sp-1);
|
43fc17 | 1999-09-19 | Fredrik Hübinette (Hubbe) | | if($$->name) free_string($$->name);
|
454d54 | 1999-09-18 | Fredrik Hübinette (Hubbe) | | add_ref( $$->name=sp[-2].u.string );
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
| idents
{
|
8d7bda | 1997-02-10 | Fredrik Hübinette (Hubbe) | | if(last_identifier)
{
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | ref_push_string(last_identifier);
|
8d7bda | 1997-02-10 | Fredrik Hübinette (Hubbe) | | }else{
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_constant_text("");
|
8d7bda | 1997-02-10 | Fredrik Hübinette (Hubbe) | | }
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | $$=$1;
}
;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
66c236 | 1998-08-29 | Henrik Grubbström (Grubba) | | /* NOTE: Pushes the resolved program on the stack. */
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | program_ref: low_program_ref
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | resolv_program($1);
free_node($1);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | |
inheritance: modifiers F_INHERIT low_program_ref optional_rename_inherit ';'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(!(new_program->flags & PROGRAM_PASS_1_DONE))
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | struct pike_string *s=sp[-1].u.string;
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | if($4) s=$4->u.sval.u.string;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | compiler_do_inherit($3,$1,s);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | if($4) free_node($4);
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | pop_n_elems(1);
free_node($3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | modifiers F_INHERIT low_program_ref error ';'
{
free_node($3); yyerrok;
}
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | modifiers F_INHERIT low_program_ref error F_LEX_EOF
{
free_node($3);
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
| modifiers F_INHERIT low_program_ref error '}'
{
free_node($3); yyerror("Missing ';'.");
}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | modifiers F_INHERIT error ';' { yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | modifiers F_INHERIT error F_LEX_EOF
{
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
| modifiers F_INHERIT error '}' { yyerror("Missing ';'."); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | import: F_IMPORT idents ';'
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | {
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | resolv_constant($2);
free_node($2);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | use_module(sp-1);
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | F_IMPORT string ';'
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | {
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | ref_push_string($2->u.sval.u.string);
free_node($2);
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | ref_push_string(lex.current_file);
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | if (error_handler && error_handler->prog) {
ref_push_object(error_handler);
SAFE_APPLY_MASTER("handle_import", 3);
} else {
SAFE_APPLY_MASTER("handle_import", 2);
}
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | use_module(sp-1);
pop_stack();
}
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | F_IMPORT error ';' { yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | F_IMPORT error F_LEX_EOF
{
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
| F_IMPORT error '}' { yyerror("Missing ';'."); }
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | ;
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | constant_name: F_IDENTIFIER '=' safe_expr0
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
int tmp;
/* This can be made more lenient in the future */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
/* Ugly hack to make sure that $3 is optimized */
tmp=compiler_pass;
$3=mknode(F_ARG_LIST,$3,0);
compiler_pass=tmp;
if(!is_const($3))
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(compiler_pass==2)
yyerror("Constant definition is not constant.");
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | /* add_constant($1->u.sval.u.string,0, current_modifiers); * Prototype */
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | } else {
|
57cddc | 1998-04-19 | Per Hedbor | | if(!num_parse_error)
|
c6ae0c | 1996-11-26 | Fredrik Hübinette (Hubbe) | | {
|
57cddc | 1998-04-19 | Per Hedbor | | tmp=eval_low($3);
if(tmp < 1)
{
yyerror("Error in constant definition.");
}else{
pop_n_elems(tmp-1);
add_constant($1->u.sval.u.string,sp-1,current_modifiers);
pop_stack();
}
|
c6ae0c | 1996-11-26 | Fredrik Hübinette (Hubbe) | | }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if($3) free_node($3);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | | bad_identifier '=' safe_expr0 { if ($3) free_node($3); }
| error '=' safe_expr0 { if ($3) free_node($3); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | ;
constant_list: constant_name
| constant_list ',' constant_name
;
|
3bcd58 | 1997-04-08 | Marcus Comstedt | | constant: modifiers F_CONSTANT constant_list ';' {}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | modifiers F_CONSTANT error ';' { yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | modifiers F_CONSTANT error F_LEX_EOF
{
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
| modifiers F_CONSTANT error '}' { yyerror("Missing ';'."); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | ;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | block_or_semi: block
{
$$ = mknode(F_ARG_LIST,$1,mknode(F_RETURN,mkintnode(0),0));
}
| ';' { $$ = NULL;}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
type_or_error: simple_type
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(compiler_frame->current_type)
free_string(compiler_frame->current_type);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | copy_shared_string(compiler_frame->current_type,$1->u.sval.u.string);
free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | def: modifiers type_or_error optional_stars F_IDENTIFIER
{
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | push_compiler_frame(0);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(!compiler_frame->previous ||
!compiler_frame->previous->current_type)
{
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | yyerror("Internal compiler fault.");
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | copy_shared_string(compiler_frame->current_type,
mixed_type_string);
}else{
copy_shared_string(compiler_frame->current_type,
compiler_frame->previous->current_type);
}
}
'(' arguments ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
int e;
/* construct the function type */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->current_type);
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | while(--$3>=0) push_type(T_ARRAY);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(compiler_frame->current_return_type)
free_string(compiler_frame->current_return_type);
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | compiler_frame->current_return_type=compiler_pop_type();
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->current_return_type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | e=$7-1;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | if(varargs)
{
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->variable[e].type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | e--;
varargs=0;
pop_type_stack();
}else{
push_type(T_VOID);
}
push_type(T_MANY);
for(; e>=0; e--)
{
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->variable[e].type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
push_type(T_FUNCTION);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | |
{
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *s=compiler_pop_type();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $<n>$=mkstrnode(s);
free_string(s);
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
if(compiler_pass==1)
{
|
ae9503 | 1999-04-07 | Fredrik Hübinette (Hubbe) | | $<number>5=define_function($4->u.sval.u.string,
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $<n>$->u.sval.u.string,
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | $1,
IDENTIFIER_PIKE_FUNCTION,
0);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
block_or_semi
{
int e;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if($10)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | | int f;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | for(e=0; e<$7; e++)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(!compiler_frame->variable[e].name ||
!compiler_frame->variable[e].name->len)
{
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | my_yyerror("Missing name for argument %d.",e);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
329cc0 | 1997-02-17 | Fredrik Hübinette (Hubbe) | |
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | | f=dooptcode($4->u.sval.u.string, $10, $<n>9->u.sval.u.string, $1);
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
294dc5 | 1997-08-03 | Fredrik Hübinette (Hubbe) | | if(recoveries && sp-evaluator_stack < recoveries->sp)
fatal("Stack error (underflow)\n");
|
ae9503 | 1999-04-07 | Fredrik Hübinette (Hubbe) | |
if(compiler_pass == 1 && f!=$<number>5)
fatal("define_function screwed up! %d != %d\n",f,$<number>5);
|
294dc5 | 1997-08-03 | Fredrik Hübinette (Hubbe) | | #endif
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_compiler_frame();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($4);
free_node($<n>9);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | modifiers type_or_error optional_stars bad_identifier
'(' arguments ')' block_or_semi
{
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | free_string(compiler_pop_type());
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | modifiers type_or_error name_list ';' {}
| inheritance {}
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | | import {}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | constant {}
|
121d49 | 1996-11-27 | Fredrik Hübinette (Hubbe) | | | class { free_node($1); }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | error F_LEX_EOF
{
reset_type_stack();
yyerror("Missing ';'.");
yyerror("Unexpected end of file");
}
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | | error ';'
{
reset_type_stack();
yyerrok;
/* if(num_parse_error>5) YYACCEPT; */
}
|
296836 | 1998-04-14 | Henrik Grubbström (Grubba) | | | error '}'
{
reset_type_stack();
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | yyerror("Missing ';'.");
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | /* yychar = '}'; */ /* Put the '}' back on the input stream */
|
296836 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
optional_dot_dot_dot: F_DOT_DOT_DOT { $$=1; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | /* empty */ { $$=0; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
optional_identifier: F_IDENTIFIER
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | bad_identifier { $$=0; }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | /* empty */ { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | new_arg_name: type7 optional_dot_dot_dot optional_identifier
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
if(varargs) yyerror("Can't define more arguments after ...");
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | if($2)
{
push_type(T_ARRAY);
varargs=1;
}
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(!$3)
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | {
struct pike_string *s;
MAKE_CONSTANT_SHARED_STRING(s,"");
$3=mkstrnode(s);
free_string(s);
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
96ab24 | 1998-02-28 | Fredrik Hübinette (Hubbe) | | if($3->u.sval.u.string->len &&
islocal($3->u.sval.u.string) >= 0)
|
c01239 | 1997-03-11 | Henrik Grubbström (Grubba) | | my_yyerror("Variable '%s' appears twice in argument list.",
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $3->u.sval.u.string->str);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | add_local_name($3->u.sval.u.string, compiler_pop_type());
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | func_args: '(' arguments ')' { $$=$2; }
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | | '(' error ')' { $$=0; yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | '(' error F_LEX_EOF
{
$$=0; yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
| '(' error ';' { $$=0; yyerror("Missing ')'."); }
| '(' error '}' { $$=0; yyerror("Missing ')'."); }
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | | error { $$=0; yyerrok; }
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | arguments: /* empty */ optional_comma { $$=0; }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | arguments2 optional_comma
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
arguments2: new_arg_name { $$ = 1; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | arguments2 ',' new_arg_name { $$ = $1 + 1; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
modifier: F_NO_MASK { $$ = ID_NOMASK; }
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | | F_FINAL_ID { $$ = ID_NOMASK; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_STATIC { $$ = ID_STATIC; }
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | | F_PRIVATE { $$ = ID_PRIVATE | ID_STATIC; }
| F_LOCAL_ID { $$ = ID_INLINE; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_PUBLIC { $$ = ID_PUBLIC; }
| F_PROTECTED { $$ = ID_PROTECTED; }
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | | F_INLINE { $$ = ID_INLINE; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | modifiers: modifier_list { $$=current_modifiers=$1 | lex.pragmas; } ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
modifier_list: /* empty */ { $$ = 0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | modifier modifier_list { $$ = $1 | $2; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
optional_stars: optional_stars '*' { $$=$1 + 1; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | /* empty */ { $$=0; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | cast: '(' type ')'
{
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *s=compiler_pop_type();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $$=mkstrnode(s);
free_string(s);
}
|
2e4e45 | 1997-02-13 | Fredrik Hübinette (Hubbe) | | ;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
type6: type | identifier_type ;
|
2e4e45 | 1997-02-13 | Fredrik Hübinette (Hubbe) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | type: type '*' { push_type(T_ARRAY); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | type2
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | type7: type7 '*' { push_type(T_ARRAY); }
| type4
;
simple_type: type4
{
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *s=compiler_pop_type();
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | $$=mkstrnode(s);
free_string(s);
}
;
simple_type2: type2
{
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *s=compiler_pop_type();
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | $$=mkstrnode(s);
free_string(s);
}
;
simple_identifier_type: identifier_type
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | {
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *s=compiler_pop_type();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $$=mkstrnode(s);
free_string(s);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | identifier_type: idents
{
struct program *p;
resolv_program($1);
if((p=program_from_svalue(sp-1)))
{
|
34224f | 1998-04-18 | Fredrik Hübinette (Hubbe) | | push_type_int(p->id);
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | }else{
push_type_int(0);
}
push_type(0);
push_type(T_OBJECT);
pop_stack();
free_node($1);
}
;
|
3803c2 | 1998-11-11 | Henrik Grubbström (Grubba) | | type4: type2 | identifier_type ;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | type2: type2 '|' type3 { push_type(T_OR); }
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | | type3
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | type3: F_INT_ID opt_int_range { push_type(T_INT); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_FLOAT_ID { push_type(T_FLOAT); }
| F_PROGRAM_ID { push_type(T_PROGRAM); }
| F_VOID_ID { push_type(T_VOID); }
| F_MIXED_ID { push_type(T_MIXED); }
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | | F_STRING_ID { push_type(T_STRING); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | F_OBJECT_ID opt_object_type { push_type(T_OBJECT); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_MAPPING_ID opt_mapping_type { push_type(T_MAPPING); }
| F_ARRAY_ID opt_array_type { push_type(T_ARRAY); }
| F_MULTISET_ID opt_array_type { push_type(T_MULTISET); }
| F_FUNCTION_ID opt_function_type { push_type(T_FUNCTION); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | | number_or_maxint: /* Empty */
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | $$ = mkintnode(MAX_INT32);
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | | }
| F_NUMBER
;
number_or_minint: /* Empty */
{
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | $$ = mkintnode(MIN_INT32);
|
f5fd53 | 1999-03-29 | Henrik Grubbström (Grubba) | | }
| F_NUMBER
;
opt_int_range: /* Empty */
{
push_type_int(MAX_INT32);
push_type_int(MIN_INT32);
}
| '(' number_or_minint F_DOT_DOT number_or_maxint ')'
{
/* FIXME: Check that $4 is >= $2. */
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | if($2->token == F_CONSTANT && $2->u.sval.type == T_INT)
{
push_type_int($4->u.sval.u.integer);
}else{
push_type_int(MAX_INT32);
}
if($4->token == F_CONSTANT && $4->u.sval.type == T_INT)
{
push_type_int($4->u.sval.u.integer);
}else{
push_type_int(MIN_INT32);
}
free_node($2);
free_node($4);
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
3803c2 | 1998-11-11 | Henrik Grubbström (Grubba) | | ;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | opt_object_type: /* Empty */ { push_type_int(0); push_type(0); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | '(' program_ref ')'
{
|
66c236 | 1998-08-29 | Henrik Grubbström (Grubba) | | /* NOTE: On entry, there are two items on the stack:
* sp-2: Name of the program reference (string).
* sp-1: The resolved program (program|function|zero).
*/
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct program *p=program_from_svalue(sp-1);
if(p)
|
1532e6 | 1996-11-16 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_type_int(p->id);
|
1532e6 | 1996-11-16 | Fredrik Hübinette (Hubbe) | | }else{
|
66c236 | 1998-08-29 | Henrik Grubbström (Grubba) | | if ((sp[-2].type == T_STRING) && (sp[-2].u.string->len > 0) &&
(sp[-2].u.string->len < 256)) {
my_yyerror("Not a valid program specifier: '%s'",
sp[-2].u.string->str);
} else {
yyerror("Not a valid program specifier.");
}
|
1532e6 | 1996-11-16 | Fredrik Hübinette (Hubbe) | | push_type_int(0);
}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | pop_n_elems(2);
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | push_type(0);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | opt_function_type: '('
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
type_stack_mark();
type_stack_mark();
}
function_type_list optional_dot_dot_dot ':'
{
if ($4)
{
push_type(T_MANY);
type_stack_reverse();
}else{
type_stack_reverse();
push_type(T_MANY);
push_type(T_VOID);
}
type_stack_mark();
}
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | type7 ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
type_stack_reverse();
type_stack_reverse();
}
| /* empty */
{
push_type(T_MIXED);
push_type(T_MIXED);
push_type(T_MANY);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
function_type_list: /* Empty */ optional_comma
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | function_type_list2 optional_comma
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | function_type_list2: type7
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | function_type_list2 ','
{
type_stack_reverse();
type_stack_mark();
}
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | type7
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | opt_array_type: '(' type7 ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | { push_type(T_MIXED); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
opt_mapping_type: '('
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
type_stack_mark();
type_stack_mark();
}
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | type7 ':'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
type_stack_reverse();
type_stack_mark();
}
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | type7
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
type_stack_reverse();
type_stack_reverse();
}
')'
| /* empty */
{
push_type(T_MIXED);
push_type(T_MIXED);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
name_list: new_name
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | name_list ',' new_name
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
new_name: optional_stars F_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
struct pike_string *type;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->current_type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | while($1--) push_type(T_ARRAY);
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | define_variable($2->u.sval.u.string, type, current_modifiers);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | free_string(type);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | optional_stars bad_identifier {}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | optional_stars F_IDENTIFIER '='
{
struct pike_string *type;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->current_type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | while($1--) push_type(T_ARRAY);
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $<number>$=define_variable($2->u.sval.u.string, type, current_modifiers);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | free_string(type);
}
expr0
{
init_node=mknode(F_ARG_LIST,init_node,
mkcastnode(void_type_string,
mknode(F_ASSIGN,$5,
mkidentifiernode($<number>4))));
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
296836 | 1998-04-14 | Henrik Grubbström (Grubba) | | | optional_stars F_IDENTIFIER '=' error
{
free_node($2);
}
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | | optional_stars F_IDENTIFIER '=' F_LEX_EOF
{
yyerror("Unexpected end of file in variable definition.");
free_node($2);
}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | optional_stars bad_identifier '=' expr0
{
free_node($4);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
new_local_name: optional_stars F_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
4943aa | 1998-04-09 | Fredrik Hübinette (Hubbe) | | push_finished_type($<n>0->u.sval.u.string);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | while($1--) push_type(T_ARRAY);
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | add_local_name($2->u.sval.u.string, compiler_pop_type());
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_ASSIGN,mkintnode(0),mklocalnode(islocal($2->u.sval.u.string),0));
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
5b6acd | 1998-04-30 | Fredrik Hübinette (Hubbe) | | | optional_stars bad_identifier { $$=0; }
| optional_stars F_IDENTIFIER '=' expr0
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
4943aa | 1998-04-09 | Fredrik Hübinette (Hubbe) | | push_finished_type($<n>0->u.sval.u.string);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | while($1--) push_type(T_ARRAY);
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | add_local_name($2->u.sval.u.string, compiler_pop_type());
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_ASSIGN,$4,mklocalnode(islocal($2->u.sval.u.string),0));
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | optional_stars bad_identifier '=' expr0
{
free_node($4);
|
5b6acd | 1998-04-30 | Fredrik Hübinette (Hubbe) | | $$=0;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
| optional_stars F_IDENTIFIER '=' error
{
free_node($2);
/* No yyerok here since we aren't done yet. */
|
5b6acd | 1998-04-30 | Fredrik Hübinette (Hubbe) | | $$=0;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | | optional_stars F_IDENTIFIER '=' F_LEX_EOF
{
yyerror("Unexpected end of file in local variable definition.");
free_node($2);
/* No yyerok here since we aren't done yet. */
$$=0;
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | new_local_name2: F_IDENTIFIER
{
|
e73dae | 1998-04-17 | Fredrik Hübinette (Hubbe) | | add_ref($<n>0->u.sval.u.string);
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | add_local_name($1->u.sval.u.string, $<n>0->u.sval.u.string);
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_ASSIGN,mkintnode(0),mklocalnode(islocal($1->u.sval.u.string),0));
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | free_node($1);
}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | bad_identifier { $$=mkintnode(0); }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | | F_IDENTIFIER '=' safe_expr0
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | {
|
e73dae | 1998-04-17 | Fredrik Hübinette (Hubbe) | | add_ref($<n>0->u.sval.u.string);
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | add_local_name($1->u.sval.u.string, $<n>0->u.sval.u.string);
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_ASSIGN,$3, mklocalnode(islocal($1->u.sval.u.string),0));
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | free_node($1);
}
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | | bad_identifier '=' safe_expr0 { $$=$3; }
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | block:'{'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | $<number>1=num_used_modules;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | $<number>$=compiler_frame->current_number_of_locals;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | statements end_block
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | unuse_modules(num_used_modules - $<number>1);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_local_variables($<number>2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | $$=$3;
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | end_block: '}'
| F_LEX_EOF
{
yyerror("Missing '}'.");
yyerror("Unexpected end of file.");
}
;
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | failsafe_block: block
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | | error { $$=0; }
| F_LEX_EOF { yyerror("Unexpected end of file."); $$=0; }
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | local_name_list: new_local_name
|
4943aa | 1998-04-09 | Fredrik Hübinette (Hubbe) | | | local_name_list ',' { $<n>$=$<n>0; } new_local_name { $$=mknode(F_ARG_LIST,$1,$4); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | local_name_list2: new_local_name2
| local_name_list2 ',' { $<n>$=$<n>0; } new_local_name { $$=mknode(F_ARG_LIST,$1,$4); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | statements: { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | statements statement
{
$$=mknode(F_ARG_LIST,$1,mkcastnode(void_type_string,$2));
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | statement: unused2 ';'
| import { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | cond
| while
| do
| for
| switch
| case
| default
|
586b8a | 1998-04-28 | Henrik Grubbström (Grubba) | | | return expected_semicolon
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | block
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | foreach
|
586b8a | 1998-04-28 | Henrik Grubbström (Grubba) | | | break expected_semicolon
| continue expected_semicolon
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | | error ';' { reset_type_stack(); $$=0; yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | error F_LEX_EOF
{
reset_type_stack();
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
$$=0;
}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | error '}'
{
reset_type_stack();
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | yyerror("Missing ';'.");
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | /* yychar = '}'; */ /* Put the '}' back on the input stream. */
$$=0;
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | ';' { $$=0; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
break: F_BREAK { $$=mknode(F_BREAK,0,0); } ;
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | default: F_DEFAULT ':' { $$=mknode(F_DEFAULT,0,0); }
| F_DEFAULT
{
$$=mknode(F_DEFAULT,0,0); yyerror("Expected ':' after default.");
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | continue: F_CONTINUE { $$=mknode(F_CONTINUE,0,0); } ;
lambda: F_LAMBDA
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | push_compiler_frame(1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(compiler_frame->current_return_type)
free_string(compiler_frame->current_return_type);
copy_shared_string(compiler_frame->current_return_type,any_type_string);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
01d3e2 | 1997-04-23 | Fredrik Hübinette (Hubbe) | | func_args failsafe_block
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
struct pike_string *type;
char buf[40];
|
329cc0 | 1997-02-17 | Fredrik Hübinette (Hubbe) | | int f,e;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | struct pike_string *name;
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | $4=mknode(F_ARG_LIST,$4,mknode(F_RETURN,mkintnode(0),0));
type=find_return_type($4);
if(type)
push_finished_type(type);
else
push_type(T_MIXED);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | e=$3-1;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | if(varargs)
{
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->variable[e].type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | e--;
varargs=0;
pop_type_stack();
}else{
push_type(T_VOID);
}
push_type(T_MANY);
for(; e>=0; e--)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | push_finished_type(compiler_frame->variable[e].type);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
push_type(T_FUNCTION);
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | type=compiler_pop_type();
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | | sprintf(buf,"__lambda_%ld_%ld",
(long)new_program->id,
|
c4d468 | 1998-06-06 | Henrik Grubbström (Grubba) | | (long)(local_class_counter++ & 0xffffffff)); /* OSF/1 cc bug. */
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | name=make_shared_string(buf);
|
c4d468 | 1998-06-06 | Henrik Grubbström (Grubba) | |
#ifdef LAMBDA_DEBUG
fprintf(stderr, "%d: LAMBDA: %s 0x%08lx 0x%08lx\n",
compiler_pass, buf, (long)new_program->id, local_class_counter-1);
#endif /* LAMBDA_DEBUG */
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | |
f=dooptcode(name,
$4,
type,
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | | ID_PRIVATE | ID_INLINE);
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | $$=mkidentifiernode(f);
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | if(compiler_frame->lexical_scope == 2)
$$->token=F_TRAMPOLINE;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | free_string(name);
free_string(type);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_compiler_frame();
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
586b8a | 1998-04-28 | Henrik Grubbström (Grubba) | | failsafe_program: '{' program end_block
|
e2acf7 | 1997-04-23 | Henrik Grubbström (Grubba) | | | error { yyerrok; }
|
e67c86 | 1998-08-01 | Henrik Grubbström (Grubba) | | | F_LEX_EOF
{
yyerror("End of file where program definition expected.");
}
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | ;
|
51ffdb | 1998-01-19 | Fredrik Hübinette (Hubbe) | | class: modifiers F_CLASS optional_identifier
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
23eecd | 1999-08-06 | Fredrik Hübinette (Hubbe) | | extern int num_parse_error;
int num_errors=num_parse_error;
|
51ffdb | 1998-01-19 | Fredrik Hübinette (Hubbe) | | if(!$3)
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
51ffdb | 1998-01-19 | Fredrik Hübinette (Hubbe) | | char buffer[42];
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | | sprintf(buffer,"__class_%ld_%ld",(long)new_program->id,
local_class_counter++);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | s=make_shared_string(buffer);
$3=mkstrnode(s);
free_string(s);
|
22edc2 | 1998-01-29 | Fredrik Hübinette (Hubbe) | | $1|=ID_PRIVATE | ID_INLINE;
|
51ffdb | 1998-01-19 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* fprintf(stderr, "LANGUAGE.YACC: CLASS start\n"); */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(compiler_pass==1)
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | low_start_new_program(0, $3->u.sval.u.string, $1);
|
58ef5e | 1999-10-19 | Fredrik Hübinette (Hubbe) | | if(lex.current_file)
{
store_linenumber(lex.current_line, lex.current_file);
debug_malloc_name(new_program, lex.current_file->str, lex.current_line);
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }else{
int i;
struct program *p;
struct identifier *id;
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | int tmp=compiler_pass;
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | i=isidentifier($3->u.sval.u.string);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(i<0)
{
low_start_new_program(new_program,0,0);
yyerror("Pass 2: program not defined!");
}else{
id=ID_FROM_INT(new_program, i);
if(IDENTIFIER_IS_CONSTANT(id->identifier_flags))
{
struct svalue *s;
|
43fc17 | 1999-09-19 | Fredrik Hübinette (Hubbe) | | s=&PROG_FROM_INT(new_program,i)->constants[id->func.offset].sval;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(s->type==T_PROGRAM)
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | low_start_new_program(s->u.program, $3->u.sval.u.string, $1);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }else{
yyerror("Pass 2: constant redefined!");
low_start_new_program(new_program, 0,0);
}
}else{
yyerror("Pass 2: class constant no longer constant!");
low_start_new_program(new_program, 0,0);
}
}
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | compiler_pass=tmp;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | }
|
23eecd | 1999-08-06 | Fredrik Hübinette (Hubbe) | | num_parse_error=num_errors; /* Kluge to prevent gazillion error messages */
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
febbc8 | 1997-04-22 | Fredrik Hübinette (Hubbe) | | failsafe_program
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct program *p;
if(compiler_pass == 1)
p=end_first_pass(0);
else
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | p=end_first_pass(1);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* fprintf(stderr, "LANGUAGE.YACC: CLASS end\n"); */
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $$=mkidentifiernode(isidentifier($3->u.sval.u.string));
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
if(!p)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | yyerror("Class definition failed.");
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | else
free_program(p);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($3);
check_tree($$,0);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | cond: F_IF
{
$<number>$=compiler_frame->current_number_of_locals;
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' safe_comma_expr end_cond statement optional_else_part
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | $$=mknode('?',$4,mknode(':',$6,$7));
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | $$->line_number=$1;
$$=mkcastnode(void_type_string,$$);
$$->line_number=$1;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_local_variables($<number>2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | end_cond: ')'
| '}' { yyerror("Missing ')'."); }
| F_LEX_EOF
{
yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | optional_else_part: { $$=0; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_ELSE statement { $$=$2; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | safe_lvalue: lvalue
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | error { $$=0; }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | ;
safe_expr0: expr0
|
902c29 | 1998-07-31 | Fredrik Hübinette (Hubbe) | | | F_LEX_EOF { yyerror("Unexpected end of file."); $$=mkintnode(0); }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | | error { $$=mkintnode(0); }
;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | foreach: F_FOREACH
{
$<number>$=compiler_frame->current_number_of_locals;
}
|
902c29 | 1998-07-31 | Fredrik Hübinette (Hubbe) | | '(' expr0 ',' safe_lvalue end_cond statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | if ($6) {
$$=mknode(F_FOREACH, mknode(F_VAL_LVAL,$4,$6),$8);
$$->line_number=$1;
} else {
/* Error in lvalue */
free_node($4);
$$=$8;
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_local_variables($<number>2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | do: F_DO statement F_WHILE '(' safe_comma_expr end_cond expected_semicolon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
$$=mknode(F_DO,$2,$5);
$$->line_number=$1;
}
|
07f33e | 1998-11-05 | Henrik Grubbström (Grubba) | | | F_DO statement F_WHILE F_LEX_EOF
{
$$=0;
yyerror("Missing '(' in do-while loop.");
yyerror("Unexpected end of file.");
}
| F_DO statement F_LEX_EOF
{
$$=0;
yyerror("Missing 'while' in do-while loop.");
yyerror("Unexpected end of file.");
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | expected_semicolon: ';'
| F_LEX_EOF
{
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | for: F_FOR
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | $<number>$=compiler_frame->current_number_of_locals;
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' unused expected_semicolon for_expr expected_semicolon unused end_cond
statement
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
int i=lex.current_line;
lex.current_line=$1;
$$=mknode(F_ARG_LIST,mkcastnode(void_type_string,$4),mknode(F_FOR,$6,mknode(':',$10,$8)));
lex.current_line=i;
pop_local_variables($<number>2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | while: F_WHILE
{
$<number>$=compiler_frame->current_number_of_locals;
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' safe_comma_expr end_cond statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | int i=lex.current_line;
lex.current_line=$1;
$$=mknode(F_FOR,$4,mknode(':',$6,NULL));
lex.current_line=i;
pop_local_variables($<number>2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
for_expr: /* EMPTY */ { $$=mkintnode(1); }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | safe_comma_expr
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | switch: F_SWITCH
{
$<number>$=compiler_frame->current_number_of_locals;
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | '(' safe_comma_expr end_cond statement
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_SWITCH,$4,$6);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | $$->line_number=$1;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_local_variables($<number>2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | case: F_CASE safe_comma_expr expected_colon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
$$=mknode(F_CASE,$2,0);
}
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | | F_CASE safe_comma_expr F_DOT_DOT optional_comma_expr expected_colon
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_CASE,$4?$2:0,$4?$4:$2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | expected_colon: ':'
| F_LEX_EOF
{
yyerror("Missing ';'.");
yyerror("Unexpected end of file.");
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | return: F_RETURN
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(!match_types(compiler_frame->current_return_type,
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | void_type_string))
{
yyerror("Must return a value for a non-void function.");
}
$$=mknode(F_RETURN,mkintnode(0),0);
}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | F_RETURN safe_comma_expr
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
$$=mknode(F_RETURN,$2,0);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
unused: { $$=0; }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | safe_comma_expr { $$=mkcastnode(void_type_string,$1); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
unused2: comma_expr { $$=mkcastnode(void_type_string,$1); } ;
|
ba62cf | 1997-09-18 | Fredrik Hübinette (Hubbe) | | optional_comma_expr: { $$=0; }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | safe_comma_expr
;
safe_comma_expr: comma_expr
| error { $$=mkintnode(0); }
|
ba62cf | 1997-09-18 | Fredrik Hübinette (Hubbe) | | ;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | comma_expr: comma_expr2
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | | simple_type2 local_name_list { $$=$2; free_node($1); }
| simple_identifier_type local_name_list2 { $$=$2; free_node($1); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
comma_expr2: expr0
| comma_expr2 ',' expr0
{
$$ = mknode(F_ARG_LIST,mkcastnode(void_type_string,$1),$3);
}
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr00: expr0
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | '@' expr0 { $$=mknode(F_PUSH_ARRAY,$2,0); };
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr0: expr01
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr4 '=' expr0 { $$=mknode(F_ASSIGN,$3,$1); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | expr4 '=' error { $$=$1; reset_type_stack(); yyerrok; }
|
a66319 | 1998-04-17 | Henrik Grubbström (Grubba) | | | bad_expr_ident '=' expr0 { $$=$3; }
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | | '[' low_lvalue_list ']' '=' expr0 { $$=mknode(F_ASSIGN,$5,mknode(F_ARRAY_LVALUE,$2,0)); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr4 assign expr0 { $$=mknode($2,$1,$3); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | expr4 assign error { $$=$1; reset_type_stack(); yyerrok; }
|
a66319 | 1998-04-17 | Henrik Grubbström (Grubba) | | | bad_expr_ident assign expr0 { $$=$3; }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | '[' low_lvalue_list ']' assign expr0 { $$=mknode($4,mknode(F_ARRAY_LVALUE,$2,0),$5); }
|
bdacd9 | 1998-04-15 | Henrik Grubbström (Grubba) | | | '[' low_lvalue_list ']' error { $$=$2; reset_type_stack(); yyerrok; }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /* | error { $$=0; reset_type_stack(); } */
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | expr01: expr1
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 '?' expr01 ':' expr01 { $$=mknode('?',$1,mknode(':',$3,$5)); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
assign: F_AND_EQ { $$=F_AND_EQ; }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_OR_EQ { $$=F_OR_EQ; }
| F_XOR_EQ { $$=F_XOR_EQ; }
| F_LSH_EQ { $$=F_LSH_EQ; }
| F_RSH_EQ { $$=F_RSH_EQ; }
| F_ADD_EQ { $$=F_ADD_EQ; }
| F_SUB_EQ { $$=F_SUB_EQ; }
| F_MULT_EQ{ $$=F_MULT_EQ; }
| F_MOD_EQ { $$=F_MOD_EQ; }
| F_DIV_EQ { $$=F_DIV_EQ; }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
optional_comma: | ',' ;
expr_list: { $$=0; }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | expr_list2 optional_comma
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr_list2: expr00
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr_list2 ',' expr00 { $$=mknode(F_ARG_LIST,$1,$3); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
m_expr_list: { $$=0; }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | m_expr_list2 optional_comma
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
m_expr_list2: assoc_pair
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | | m_expr_list2 ',' assoc_pair
{
if ($3) {
$$=mknode(F_ARG_LIST,$1,$3);
} else {
/* Error in assoc_pair */
$$=$1;
}
}
| m_expr_list2 ',' error
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
73a2a1 | 1998-04-27 | Henrik Grubbström (Grubba) | | assoc_pair: expr0 expected_colon expr1 { $$=mknode(F_ARG_LIST,$1,$3); }
| expr0 expected_colon error { free_node($1); $$=0; }
|
998e1f | 1998-04-15 | Henrik Grubbström (Grubba) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr1: expr2
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr1 F_LOR expr1 { $$=mknode(F_LOR,$1,$3); }
| expr1 F_LAND expr1 { $$=mknode(F_LAND,$1,$3); }
| expr1 '|' expr1 { $$=mkopernode("`|",$1,$3); }
| expr1 '^' expr1 { $$=mkopernode("`^",$1,$3); }
| expr1 '&' expr1 { $$=mkopernode("`&",$1,$3); }
| expr1 F_EQ expr1 { $$=mkopernode("`==",$1,$3); }
| expr1 F_NE expr1 { $$=mkopernode("`!=",$1,$3); }
| expr1 '>' expr1 { $$=mkopernode("`>",$1,$3); }
| expr1 F_GE expr1 { $$=mkopernode("`>=",$1,$3); }
| expr1 '<' expr1 { $$=mkopernode("`<",$1,$3); }
| expr1 F_LE expr1 { $$=mkopernode("`<=",$1,$3); }
| expr1 F_LSH expr1 { $$=mkopernode("`<<",$1,$3); }
| expr1 F_RSH expr1 { $$=mkopernode("`>>",$1,$3); }
| expr1 '+' expr1 { $$=mkopernode("`+",$1,$3); }
| expr1 '-' expr1 { $$=mkopernode("`-",$1,$3); }
| expr1 '*' expr1 { $$=mkopernode("`*",$1,$3); }
| expr1 '%' expr1 { $$=mkopernode("`%",$1,$3); }
| expr1 '/' expr1 { $$=mkopernode("`/",$1,$3); }
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | | expr1 F_LOR error
| expr1 F_LAND error
| expr1 '|' error
| expr1 '^' error
| expr1 '&' error
| expr1 F_EQ error
| expr1 F_NE error
| expr1 '>' error
| expr1 F_GE error
| expr1 '<' error
| expr1 F_LE error
| expr1 F_LSH error
| expr1 F_RSH error
| expr1 '+' error
| expr1 '-' error
| expr1 '*' error
| expr1 '%' error
| expr1 '/' error
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr2: expr3
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | cast expr2
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $$=mkcastnode($1->u.sval.u.string,$2);
free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
| F_INC expr4 { $$=mknode(F_INC,$2,0); }
| F_DEC expr4 { $$=mknode(F_DEC,$2,0); }
| F_NOT expr2 { $$=mkopernode("`!",$2,0); }
| '~' expr2 { $$=mkopernode("`~",$2,0); }
| '-' expr2 { $$=mkopernode("`-",$2,0); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr3: expr4
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | expr4 F_INC { $$=mknode(F_POST_INC,$1,0); }
| expr4 F_DEC { $$=mknode(F_POST_DEC,$1,0); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
expr4: string
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | | F_NUMBER
|
d0a7ac | 1998-04-11 | Henrik Grubbström (Grubba) | | | F_FLOAT { $$=mkfloatnode((FLOAT_TYPE)$1); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | catch
| gauge
| typeof
| sscanf
| lambda
| class
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | idents
| expr4 '(' expr_list ')' { $$=mkapplynode($1,$3); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | expr4 '(' error ')' { $$=mkapplynode($1, NULL); yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | expr4 '(' error F_LEX_EOF
{
yyerror("Missing ')'."); $$=mkapplynode($1, NULL);
yyerror("Unexpected end of file.");
}
| expr4 '(' error ';' { yyerror("Missing ')'."); $$=mkapplynode($1, NULL); }
| expr4 '(' error '}' { yyerror("Missing ')'."); $$=mkapplynode($1, NULL); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | expr4 '[' expr0 ']' { $$=mknode(F_INDEX,$1,$3); }
| expr4 '[' comma_expr_or_zero F_DOT_DOT comma_expr_or_maxint ']'
{
$$=mknode(F_RANGE,$1,mknode(F_ARG_LIST,$3,$5));
}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | expr4 '[' error ']' { $$=$1; yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | expr4 '[' error F_LEX_EOF
{
$$=$1; yyerror("Missing ']'.");
yyerror("Unexpected end of file.");
}
| expr4 '[' error ';' { $$=$1; yyerror("Missing ']'."); }
| expr4 '[' error '}' { $$=$1; yyerror("Missing ']'."); }
| expr4 '[' error ')' { $$=$1; yyerror("Missing ']'."); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | '(' comma_expr2 ')' { $$=$2; }
| '(' '{' expr_list '}' ')'
|
42d8c4 | 1998-03-04 | Fredrik Hübinette (Hubbe) | | { $$=mkefuncallnode("aggregate",$3); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | '(' '[' m_expr_list ']' ')'
|
3803c2 | 1998-11-11 | Henrik Grubbström (Grubba) | | { $$=mkefuncallnode("aggregate_mapping",$3); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | F_MULTISET_START expr_list F_MULTISET_END
{ $$=mkefuncallnode("aggregate_multiset",$2); }
|
977030 | 1998-04-17 | Henrik Grubbström (Grubba) | | | '(' error ')' { $$=mkintnode(0); yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | '(' error F_LEX_EOF
{
$$=mkintnode(0); yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
| '(' error ';' { $$=mkintnode(0); yyerror("Missing ')'."); }
| '(' error '}' { $$=mkintnode(0); yyerror("Missing ')'."); }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | | expr4 F_ARROW F_IDENTIFIER
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_ARROW,$1,$3);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | expr4 F_ARROW bad_identifier {}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | expr4 F_ARROW error {}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | ;
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | idents: low_idents
| idents '.' F_IDENTIFIER
{
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | | $$=index_node($1, last_identifier?last_identifier->str:NULL,
$3->u.sval.u.string);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
e319bb | 1997-02-28 | Fredrik Hübinette (Hubbe) | | if(last_identifier) free_string(last_identifier);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | copy_shared_string(last_identifier, $3->u.sval.u.string);
free_node($3);
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | }
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | | '.' F_IDENTIFIER
{
node *tmp;
push_text(".");
|
b47b11 | 1998-04-20 | Henrik Grubbström (Grubba) | | ref_push_string(lex.current_file);
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | if (error_handler && error_handler->prog) {
ref_push_object(error_handler);
SAFE_APPLY_MASTER("handle_import", 3);
} else {
SAFE_APPLY_MASTER("handle_import", 2);
}
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | tmp=mkconstantsvaluenode(sp-1);
pop_stack();
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | | $$=index_node(tmp, ".", $2->u.sval.u.string);
|
eb5c90 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | free_node(tmp);
if(last_identifier) free_string(last_identifier);
copy_shared_string(last_identifier, $2->u.sval.u.string);
free_node($2);
}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | idents '.' bad_identifier {}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | idents '.' error {}
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | ;
low_idents: F_IDENTIFIER
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
int i;
struct efun *f;
|
8d7bda | 1997-02-10 | Fredrik Hübinette (Hubbe) | | if(last_identifier) free_string(last_identifier);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | copy_shared_string(last_identifier, $1->u.sval.u.string);
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | |
if(($$=lexical_islocal(last_identifier)))
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | /* done, nothing to do here */
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | }else if((i=isidentifier(last_identifier))>=0){
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | $$=mkidentifiernode(i);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | }else if(!($$=find_module_identifier(last_identifier))){
|
d43aff | 1997-08-03 | Fredrik Hübinette (Hubbe) | | if(!num_parse_error)
|
dffa01 | 1997-01-15 | Fredrik Hübinette (Hubbe) | | {
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | if(compiler_pass==2)
{
my_yyerror("'%s' undefined.", last_identifier->str);
$$=0;
}else{
$$=mknode(F_UNDEFINED,0,0);
}
}else{
|
319522 | 1998-03-04 | Henrik Grubbström (Grubba) | | $$=mkintnode(0);
|
dffa01 | 1997-01-15 | Fredrik Hübinette (Hubbe) | | }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($1);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
| F_PREDEF F_COLON_COLON F_IDENTIFIER
{
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | struct svalue tmp;
node *tmp2;
tmp.type=T_MAPPING;
|
94a297 | 1997-03-01 | Henrik Grubbström (Grubba) | | #ifdef __CHECKER__
tmp.subtype=0;
#endif /* __CHECKER__ */
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | | if(last_identifier) free_string(last_identifier);
copy_shared_string(last_identifier, $3->u.sval.u.string);
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | tmp.u.mapping=get_builtin_constants();
tmp2=mkconstantsvaluenode(&tmp);
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | | $$=index_node(tmp2, "predef", $3->u.sval.u.string);
|
43fc17 | 1999-09-19 | Fredrik Hübinette (Hubbe) | | if(!$$->name)
add_ref( $$->name=$3->u.sval.u.string );
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | free_node(tmp2);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_PREDEF F_COLON_COLON bad_identifier
{
$$=mkintnode(0);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_IDENTIFIER F_COLON_COLON F_IDENTIFIER
{
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | | if(last_identifier) free_string(last_identifier);
copy_shared_string(last_identifier, $3->u.sval.u.string);
|
d429a7 | 1998-02-24 | Fredrik Hübinette (Hubbe) | | $$=reference_inherited_identifier($1->u.sval.u.string,
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $3->u.sval.u.string);
|
a005eb | 1999-03-04 | Fredrik Hübinette (Hubbe) | |
|
d429a7 | 1998-02-24 | Fredrik Hübinette (Hubbe) | | if (!$$)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | my_yyerror("Undefined identifier %s::%s",
$1->u.sval.u.string->str,
$3->u.sval.u.string->str);
|
dffa01 | 1997-01-15 | Fredrik Hübinette (Hubbe) | | $$=mkintnode(0);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($1);
free_node($3);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_IDENTIFIER F_COLON_COLON bad_identifier
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | F_IDENTIFIER F_COLON_COLON error
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | F_COLON_COLON F_IDENTIFIER
{
int e,i;
|
fae37d | 1998-08-30 | Henrik Grubbström (Grubba) | | if(last_identifier) free_string(last_identifier);
copy_shared_string(last_identifier, $2->u.sval.u.string);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | $$=0;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | for(e=1;e<(int)new_program->num_inherits;e++)
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if(new_program->inherits[e].inherit_level!=1) continue;
|
8aae6d | 1999-08-19 | Fredrik Hübinette (Hubbe) | | i=low_reference_inherited_identifier(0,e,$2->u.sval.u.string,SEE_STATIC);
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(i==-1) continue;
if($$)
{
$$=mknode(F_ARG_LIST,$$,mkidentifiernode(i));
}else{
$$=mkidentifiernode(i);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
if(!$$)
{
|
a5787d | 1999-03-03 | Fredrik Hübinette (Hubbe) | | if(ISCONSTSTR($2->u.sval.u.string,"`->") ||
ISCONSTSTR($2->u.sval.u.string,"`[]") )
{
|
624f57 | 1999-03-11 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_MAGIC_INDEX,mkintnode(0),mkintnode(0));
|
a5787d | 1999-03-03 | Fredrik Hübinette (Hubbe) | | }
else if(ISCONSTSTR($2->u.sval.u.string,"`->=") ||
ISCONSTSTR($2->u.sval.u.string,"`[]=") )
{
|
624f57 | 1999-03-11 | Fredrik Hübinette (Hubbe) | | $$=mknode(F_MAGIC_SET_INDEX,mkintnode(0),mkintnode(0));
|
a5787d | 1999-03-03 | Fredrik Hübinette (Hubbe) | | }
else
{
$$=mkintnode(0);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }else{
|
45e8a8 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if($$->token==F_ARG_LIST) $$=mkefuncallnode("aggregate",$$);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_COLON_COLON bad_identifier
{
$$=mkintnode(0);
}
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
comma_expr_or_zero: /* empty */ { $$=mkintnode(0); }
|
55356e | 1999-05-26 | Fredrik Hübinette (Hubbe) | | | comma_expr
| F_LEX_EOF { yyerror("Unexpected end of file."); $$=mkintnode(0); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
comma_expr_or_maxint: /* empty */ { $$=mkintnode(0x7fffffff); }
|
55356e | 1999-05-26 | Fredrik Hübinette (Hubbe) | | | comma_expr
| F_LEX_EOF { yyerror("Unexpected end of file."); $$=mkintnode(0x7fffffff); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
gauge: F_GAUGE catch_arg
{
|
4868db | 1997-05-07 | Per Hedbor | | #ifdef HAVE_GETHRVTIME
|
ee2f20 | 1999-10-10 | Fredrik Noring | | $$=mkefuncallnode("abs",
|
4868db | 1997-05-07 | Per Hedbor | | mkopernode("`/",
mkopernode("`-", mkefuncallnode("gethrvtime",0),
mknode(F_ARG_LIST,$2,
mkefuncallnode("gethrvtime",0))),
|
ee2f20 | 1999-10-10 | Fredrik Noring | | mkfloatnode((FLOAT_TYPE)1000000.0)));
|
4868db | 1997-05-07 | Per Hedbor | | #else
|
ee2f20 | 1999-10-10 | Fredrik Noring | | $$=mkefuncallnode("abs",
mkopernode("`/",
mkopernode("`-",
mknode(F_INDEX,mkefuncallnode("rusage",0),
mkintnode(GAUGE_RUSAGE_INDEX)),
mknode(F_ARG_LIST,$2,
mknode(F_INDEX,mkefuncallnode("rusage",0),
mkintnode(GAUGE_RUSAGE_INDEX)))),
mkfloatnode((FLOAT_TYPE)1000.0)));
|
4868db | 1997-05-07 | Per Hedbor | | #endif
};
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
typeof: F_TYPEOF '(' expr0 ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | node *tmp;
tmp=mknode(F_ARG_LIST,$3,0);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | |
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | s=describe_type( tmp && CAR(tmp) && CAR(tmp)->type ? CAR(tmp)->type : mixed_type_string);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | $$=mkstrnode(s);
free_string(s);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | free_node(tmp);
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
| F_TYPEOF '(' error ')' { $$=mkintnode(0); yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | F_TYPEOF '(' error '}' { $$=mkintnode(0); yyerror("Missing ')'."); }
| F_TYPEOF '(' error F_LEX_EOF
{
$$=mkintnode(0); yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
| F_TYPEOF '(' error ';' { $$=mkintnode(0); yyerror("Missing ')'."); }
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | ;
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | |
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | catch_arg: '(' comma_expr ')' { $$=$2; }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | '(' error ')' { $$=mkintnode(0); yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | '(' error F_LEX_EOF
{
$$=mkintnode(0); yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
| '(' error '}' { $$=mkintnode(0); yyerror("Missing ')'."); }
| '(' error ';' { $$=mkintnode(0); yyerror("Missing ')'."); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | block
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | catch: F_CATCH
{
catch_level++;
}
catch_arg
{
$$=mknode(F_CATCH,$3,NULL);
catch_level--;
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
sscanf: F_SSCANF '(' expr0 ',' expr0 lvalue_list ')'
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
$$=mknode(F_SSCANF,mknode(F_ARG_LIST,$3,$5),$6);
}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | F_SSCANF '(' expr0 ',' expr0 error ')'
{
$$=mkintnode(0);
free_node($3);
free_node($5);
yyerrok;
}
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | F_SSCANF '(' expr0 ',' expr0 error F_LEX_EOF
{
$$=mkintnode(0);
free_node($3);
free_node($5);
yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
| F_SSCANF '(' expr0 ',' expr0 error '}'
{
$$=mkintnode(0);
free_node($3);
free_node($5);
yyerror("Missing ')'.");
}
| F_SSCANF '(' expr0 ',' expr0 error ';'
{
$$=mkintnode(0);
free_node($3);
free_node($5);
yyerror("Missing ')'.");
}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | F_SSCANF '(' expr0 error ')'
{
$$=mkintnode(0);
free_node($3);
yyerrok;
}
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | F_SSCANF '(' expr0 error F_LEX_EOF
{
$$=mkintnode(0);
free_node($3);
yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
| F_SSCANF '(' expr0 error '}'
{
$$=mkintnode(0);
free_node($3);
yyerror("Missing ')'.");
}
| F_SSCANF '(' expr0 error ';'
{
$$=mkintnode(0);
free_node($3);
yyerror("Missing ')'.");
}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | F_SSCANF '(' error ')' { $$=mkintnode(0); yyerrok; }
|
db271d | 1998-04-27 | Henrik Grubbström (Grubba) | | | F_SSCANF '(' error F_LEX_EOF
{
$$=mkintnode(0); yyerror("Missing ')'.");
yyerror("Unexpected end of file.");
}
| F_SSCANF '(' error '}' { $$=mkintnode(0); yyerror("Missing ')'."); }
| F_SSCANF '(' error ';' { $$=mkintnode(0); yyerror("Missing ')'."); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | lvalue: expr4
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | | '[' low_lvalue_list ']' { $$=mknode(F_ARRAY_LVALUE, $2,0); }
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | | type6 F_IDENTIFIER
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | add_local_name($2->u.sval.u.string,compiler_pop_type());
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | $$=mklocalnode(islocal($2->u.sval.u.string),0);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_node($2);
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
|
39245b | 1998-04-17 | Henrik Grubbström (Grubba) | | | bad_lvalue
{ $$=mkintnode(0); }
;
|
bdacd9 | 1998-04-15 | Henrik Grubbström (Grubba) | | low_lvalue_list: lvalue lvalue_list { $$=mknode(F_LVALUE_LIST,$1,$2); }
|
2a3269 | 1998-01-31 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | lvalue_list: /* empty */ { $$ = 0; }
|
3ddb53 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | | ',' lvalue lvalue_list { $$ = mknode(F_LVALUE_LIST,$2,$3); }
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | ;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | string: F_STRING
| string F_STRING
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | {
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | struct pike_string *a,*b;
copy_shared_string(a,$1->u.sval.u.string);
copy_shared_string(b,$2->u.sval.u.string);
free_node($1);
free_node($2);
a=add_and_free_shared_strings(a,b);
$$=mkstrnode(a);
free_string(a);
|
7e5057 | 1996-11-02 | Fredrik Hübinette (Hubbe) | | }
;
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | /*
* Some error-handling
*/
|
07f85b | 1998-08-30 | Henrik Grubbström (Grubba) | | /* FIXME: Should probably set last_identifier. */
|
39245b | 1998-04-17 | Henrik Grubbström (Grubba) | | bad_identifier: bad_lvalue
| F_CLASS
{ yyerror("class is a reserved word."); }
;
|
a66319 | 1998-04-17 | Henrik Grubbström (Grubba) | | bad_lvalue: bad_expr_ident
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_ARRAY_ID
{ yyerror("array is a reserved word."); }
| F_FLOAT_ID
{ yyerror("float is a reserved word.");}
|
39245b | 1998-04-17 | Henrik Grubbström (Grubba) | | | F_FUNCTION_ID
{ yyerror("function is a reserved word.");}
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_INT_ID
{ yyerror("int is a reserved word."); }
| F_MAPPING_ID
{ yyerror("mapping is a reserved word."); }
|
39245b | 1998-04-17 | Henrik Grubbström (Grubba) | | | F_MIXED_ID
{ yyerror("mixed is a reserved word."); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_MULTISET_ID
{ yyerror("multiset is a reserved word."); }
|
39245b | 1998-04-17 | Henrik Grubbström (Grubba) | | | F_OBJECT_ID
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | { yyerror("object is a reserved word."); }
|
39245b | 1998-04-17 | Henrik Grubbström (Grubba) | | | F_PROGRAM_ID
|
97358e | 1998-04-23 | Fredrik Hübinette (Hubbe) | | { yyerror("program is a reserved word."); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_STRING_ID
{ yyerror("string is a reserved word."); }
| F_VOID_ID
{ yyerror("void is a reserved word."); }
|
a66319 | 1998-04-17 | Henrik Grubbström (Grubba) | | ;
bad_expr_ident:
F_INLINE
{ yyerror("inline is a reserved word."); }
| F_LOCAL_ID
{ yyerror("local is a reserved word."); }
| F_NO_MASK
{ yyerror("nomask is a reserved word."); }
| F_PREDEF
{ yyerror("predef is a reserved word."); }
| F_PRIVATE
{ yyerror("private is a reserved word."); }
| F_PROTECTED
{ yyerror("protected is a reserved word."); }
| F_PUBLIC
{ yyerror("public is a reserved word."); }
| F_STATIC
{ yyerror("static is a reserved word."); }
| F_FINAL_ID
{ yyerror("final is a reserved word.");}
|
4d2133 | 1998-04-14 | Henrik Grubbström (Grubba) | | | F_DO
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | { yyerror("do is a reserved word."); }
| F_ELSE
|
2a7c7c | 1999-07-18 | Fredrik Hübinette (Hubbe) | | { yyerror("else without if."); }
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | | F_RETURN
{ yyerror("return is a reserved word."); }
| F_CONSTANT
{ yyerror("constant is a reserved word."); }
| F_IMPORT
{ yyerror("import is a reserved word."); }
| F_INHERIT
{ yyerror("inherit is a reserved word."); }
| F_CATCH
{ yyerror("catch is a reserved word."); }
| F_GAUGE
{ yyerror("gauge is a reserved word."); }
| F_LAMBDA
{ yyerror("lambda is a reserved word."); }
| F_SSCANF
{ yyerror("sscanf is a reserved word."); }
| F_SWITCH
{ yyerror("switch is a reserved word."); }
| F_TYPEOF
{ yyerror("typeof is a reserved word."); }
| F_BREAK
{ yyerror("break is a reserved word."); }
| F_CASE
{ yyerror("case is a reserved word."); }
| F_CONTINUE
{ yyerror("continue is a reserved word."); }
| F_DEFAULT
{ yyerror("default is a reserved word."); }
| F_FOR
{ yyerror("for is a reserved word."); }
| F_FOREACH
{ yyerror("foreach is a reserved word."); }
| F_IF
{ yyerror("if is a reserved word."); }
;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | %%
void yyerror(char *str)
{
extern int num_parse_error;
|
523e64 | 1996-12-10 | David Hedbor | | extern int cumulative_parse_error;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
294dc5 | 1997-08-03 | Fredrik Hübinette (Hubbe) | | if(recoveries && sp-evaluator_stack < recoveries->sp)
fatal("Stack error (underflow)\n");
#endif
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | if (num_parse_error > 10) return;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | num_parse_error++;
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | cumulative_parse_error++;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | |
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | if ((error_handler && error_handler->prog) || get_master())
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | {
|
52b45e | 1999-06-20 | Henrik Grubbström (Grubba) | | if (lex.current_file) {
ref_push_string(lex.current_file);
} else {
/* yyerror() can be called from define_function(), which
* can be called by the C module initialization code.
*/
push_constant_text("");
}
|
2416d8 | 1998-01-27 | Fredrik Hübinette (Hubbe) | | push_int(lex.current_line);
push_text(str);
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | if (error_handler && error_handler->prog) {
safe_apply(error_handler, "compile_error", 3);
} else {
SAFE_APPLY_MASTER("compile_error", 3);
}
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | pop_stack();
}else{
|
52b45e | 1999-06-20 | Henrik Grubbström (Grubba) | | if (lex.current_file) {
(void)fprintf(stderr, "%s:%ld: %s\n",
lex.current_file->str,
(long)lex.current_line,
str);
} else {
(void)fprintf(stderr, "NULL:%ld: %s\n",
(long)lex.current_line,
str);
}
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | fflush(stderr);
}
}
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | /* argument must be a shared string */
|
e73dae | 1998-04-17 | Fredrik Hübinette (Hubbe) | | /* Note that this function eats a reference to 'type' */
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | void add_local_name(struct pike_string *str,
struct pike_string *type)
{
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | reference_shared_string(str);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | if (compiler_frame->current_number_of_locals == MAX_LOCAL)
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | {
|
8c77b6 | 1998-04-13 | Henrik Grubbström (Grubba) | | yyerror("Too many local variables.");
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | }else {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | compiler_frame->variable[compiler_frame->current_number_of_locals].type = type;
compiler_frame->variable[compiler_frame->current_number_of_locals].name = str;
compiler_frame->current_number_of_locals++;
if(compiler_frame->current_number_of_locals >
compiler_frame->max_number_of_locals)
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | {
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | compiler_frame->max_number_of_locals=
compiler_frame->current_number_of_locals;
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | }
}
}
/* argument must be a shared string */
int islocal(struct pike_string *str)
{
int e;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | for(e=compiler_frame->current_number_of_locals-1;e>=0;e--)
if(compiler_frame->variable[e].name==str)
|
215bed | 1996-09-28 | Fredrik Hübinette (Hubbe) | | return e;
return -1;
}
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | |
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | /* argument must be a shared string */
static node *lexical_islocal(struct pike_string *str)
{
int e,depth=0;
struct compiler_frame *f=compiler_frame;
while(1)
{
for(e=f->current_number_of_locals-1;e>=0;e--)
{
if(f->variable[e].name==str)
{
struct compiler_frame *q=compiler_frame;
while(q!=f)
{
q->lexical_scope=2;
q=q->previous;
}
return mklocalnode(e,depth);
}
}
if(!f->lexical_scope) return 0;
depth++;
f=f->previous;
}
}
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | void cleanup_compiler(void)
{
if(last_identifier)
{
free_string(last_identifier);
last_identifier=0;
}
}
|