From f76b4c7b7d5b03c64fe63c0268d4cf992fffce07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Thu, 11 May 2000 16:09:46 +0200 Subject: [PATCH] Separated tokens (TOK_*) and opcodes (F_*). Tokens are still generated by language.yacc, while opcodes are now defined in opcodes.h. This should make less files depend on language.yacc, and make it possible to stabilize the opcode encoding. Rev: src/array.c:1.71 Rev: src/builtin_functions.c:1.274 Rev: src/cpp.c:1.63 Rev: src/docode.c:1.73 Rev: src/language.yacc:1.185 Rev: src/las.c:1.179 Rev: src/lex.c:1.80 Rev: src/lexer.h:1.17 Rev: src/mapping.c:1.83 Rev: src/opcodes.h:1.6 Rev: src/peep.c:1.33 Rev: src/pike_types.c:1.130 Rev: src/program.c:1.237 --- src/array.c | 4 +- src/builtin_functions.c | 3 +- src/cpp.c | 4 +- src/docode.c | 7 +- src/language.yacc | 849 ++++++++++++++++++---------------------- src/las.c | 5 +- src/lex.c | 3 +- src/lexer.h | 164 ++++---- src/mapping.c | 4 +- src/opcodes.h | 227 ++++++++++- src/peep.c | 3 +- src/pike_types.c | 3 +- src/program.c | 3 +- 13 files changed, 710 insertions(+), 569 deletions(-) diff --git a/src/array.c b/src/array.c index 3786a90a90..5072cad5d2 100644 --- a/src/array.c +++ b/src/array.c @@ -11,7 +11,7 @@ #include "las.h" #include "stralloc.h" #include "interpret.h" -#include "language.h" +#include "opcodes.h" #include "error.h" #include "pike_types.h" #include "fsort.h" @@ -23,7 +23,7 @@ #include "stuff.h" #include "bignum.h" -RCSID("$Id: array.c,v 1.70 2000/05/03 09:00:44 hubbe Exp $"); +RCSID("$Id: array.c,v 1.71 2000/05/11 14:09:44 grubba Exp $"); struct array empty_array= { diff --git a/src/builtin_functions.c b/src/builtin_functions.c index d72bb411f1..54c58652af 100644 --- a/src/builtin_functions.c +++ b/src/builtin_functions.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: builtin_functions.c,v 1.273 2000/05/07 00:39:17 hubbe Exp $"); +RCSID("$Id: builtin_functions.c,v 1.274 2000/05/11 14:09:45 grubba Exp $"); #include "interpret.h" #include "svalue.h" #include "pike_macros.h" @@ -40,7 +40,6 @@ RCSID("$Id: builtin_functions.c,v 1.273 2000/05/07 00:39:17 hubbe Exp $"); #include "security.h" #include "builtin_functions.h" #include "bignum.h" -#include "language.h" #ifdef HAVE_POLL #ifdef HAVE_POLL_H diff --git a/src/cpp.c b/src/cpp.c index bb288e2a66..16efd5e53b 100644 --- a/src/cpp.c +++ b/src/cpp.c @@ -5,11 +5,9 @@ \*/ /* - * $Id: cpp.c,v 1.62 2000/03/30 09:54:18 hubbe Exp $ + * $Id: cpp.c,v 1.63 2000/05/11 14:09:45 grubba Exp $ */ #include "global.h" -#include "language.h" -#include "lex.h" #include "stralloc.h" #include "module_support.h" #include "interpret.h" diff --git a/src/docode.c b/src/docode.c index 37337b0cce..d6c47d7714 100644 --- a/src/docode.c +++ b/src/docode.c @@ -5,10 +5,9 @@ \*/ /**/ #include "global.h" -RCSID("$Id: docode.c,v 1.72 2000/05/01 03:33:45 hubbe Exp $"); +RCSID("$Id: docode.c,v 1.73 2000/05/11 14:09:45 grubba Exp $"); #include "las.h" #include "program.h" -#include "language.h" #include "pike_types.h" #include "stralloc.h" #include "interpret.h" @@ -19,12 +18,14 @@ RCSID("$Id: docode.c,v 1.72 2000/05/01 03:33:45 hubbe Exp $"); #include "pike_memory.h" #include "svalue.h" #include "main.h" -#include "lex.h" #include "builtin_functions.h" #include "peep.h" #include "docode.h" #include "operators.h" #include "object.h" +#include "opcodes.h" +#include "language.h" +#include "lex.h" static int do_docode2(node *n,int flags); diff --git a/src/language.yacc b/src/language.yacc index 7ae2908a19..668abd30ab 100644 --- a/src/language.yacc +++ b/src/language.yacc @@ -6,196 +6,110 @@ \*/ /**/ %pure_parser -/* - * These values are used by the stack machine, and can not be directly - * called from Pike. - */ -%token F_OFFSET - -%token F_PREFIX_256 F_PREFIX_512 F_PREFIX_768 F_PREFIX_1024 -%token F_PREFIX_CHARX256 F_PREFIX_WORDX256 F_PREFIX_24BITX256 - -%token F_PREFIX2_256 F_PREFIX2_512 F_PREFIX2_768 F_PREFIX2_1024 -%token F_PREFIX2_CHARX256 F_PREFIX2_WORDX256 F_PREFIX2_24BITX256 - -%token F_POP_VALUE F_POP_N_ELEMS F_MARK F_MARK2 F_MARK_X F_POP_MARK -%token F_CALL_LFUN F_CALL_LFUN_AND_POP F_CALL_LFUN_AND_RETURN -%token F_APPLY F_APPLY_AND_POP F_MARK_APPLY F_MARK_APPLY_POP -%token F_APPLY_AND_RETURN F_MARK_AND_STRING -%token F_APPLY_ASSIGN_LOCAL F_APPLY_ASSIGN_LOCAL_AND_POP - -%token F_BRANCH F_BRANCH_WHEN_ZERO F_BRANCH_WHEN_NON_ZERO -%token F_BRANCH_AND_POP_WHEN_ZERO F_BRANCH_AND_POP_WHEN_NON_ZERO -%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 -%token F_BRANCH_IF_LOCAL F_BRANCH_IF_NOT_LOCAL -%token F_BRANCH_IF_NOT_LOCAL_ARROW -%token F_INC_LOOP F_DEC_LOOP -%token F_INC_NEQ_LOOP F_DEC_NEQ_LOOP -%token F_RECUR F_TAIL_RECUR F_COND_RECUR - -%token F_LEXICAL_LOCAL F_LEXICAL_LOCAL_LVALUE - -%token F_INDEX F_ARROW F_INDIRECT F_STRING_INDEX F_LOCAL_INDEX -%token F_LOCAL_LOCAL_INDEX F_LOCAL_ARROW F_GLOBAL_LOCAL_INDEX -%token F_POS_INT_INDEX F_NEG_INT_INDEX F_MAGIC_INDEX F_MAGIC_SET_INDEX -%token F_LTOSVAL F_LTOSVAL2 -%token F_PUSH_ARRAY -%token F_RANGE F_COPY_VALUE + +%token TOK_ARROW /* * Basic value pushing */ -%token F_LFUN F_TRAMPOLINE -%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 -%token F_CLEAR_LOCAL F_CLEAR_2_LOCAL F_CLEAR_4_LOCAL -%token F_CLEAR_STRING_SUBTYPE -%token F_CONSTANT F_FLOAT F_STRING F_ARROW_STRING -%token F_NUMBER F_NEG_NUMBER F_CONST_1 F_CONST0 F_CONST1 F_BIGNUM -%token F_UNDEFINED +%token TOK_CONSTANT TOK_FLOAT TOK_STRING +%token TOK_NUMBER + /* * 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 -%token F_RETURN F_DUMB_RETURN F_RETURN_0 F_RETURN_1 F_RETURN_LOCAL -%token F_RETURN_IF_TRUE F_THROW_ZERO - -%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 -%token F_LOCAL_2_LOCAL F_LOCAL_2_GLOBAL F_GLOBAL_2_LOCAL -%token F_ADD F_SUBTRACT F_ADD_INT F_ADD_NEG_INT -%token F_ADD_TO_AND_POP F_ADD_FLOATS F_ADD_INTS -%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 -%token F_EQ_OR F_EQ_AND - -%token F_SWITCH F_SSCANF F_CATCH -%token F_CAST -%token F_SOFT_CAST -%token F_FOREACH - -%token F_SIZEOF F_SIZEOF_LOCAL -%token F_CALL_FUNCTION F_CALL_FUNCTION_AND_RETURN +%token TOK_INC TOK_DEC +%token TOK_RETURN -/* - * These are token values that needn't have an associated code for the - * compiled file - */ -%token F_MAX_OPCODE +%token TOK_EQ TOK_GE TOK_LE TOK_NE +%token TOK_NOT +%token TOK_LSH TOK_RSH +%token TOK_LAND TOK_LOR + +%token TOK_SWITCH TOK_SSCANF TOK_CATCH +%token TOK_FOREACH /* This is the end of file marker used by the lexer * to enable nicer EOF in error handling. */ -%token F_LEX_EOF - -%token F_ADD_EQ -%token F_AND_EQ -%token F_ARG_LIST -%token F_COMMA_EXPR -%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 -%token F_REDEF -%token F_EFUN_CALL -%token F_ELSE -%token F_EXTERN -%token F_FLOAT_ID -%token F_FOR -%token F_FUNCTION_ID -%token F_GAUGE -%token F_IDENTIFIER -%token F_IF -%token F_IMPORT -%token F_INHERIT -%token F_INLINE -%token F_LOCAL_ID -%token F_FINAL_ID -%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 -%token F_ARRAY_LVALUE -%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 -%token F_PREDEF -%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 -%token F_NOP -%token F_UNDEFINED -%token F_OPTIONAL - -%token F_ALIGN -%token F_POINTER -%token F_LABEL -%token F_DATA -%token F_START_FUNCTION -%token F_BYTE - -%token F_MAX_INSTR +%token TOK_LEX_EOF + +%token TOK_ADD_EQ +%token TOK_AND_EQ +%token TOK_ARRAY_ID +%token TOK_BREAK +%token TOK_CASE +%token TOK_CLASS +%token TOK_COLON_COLON +%token TOK_CONTINUE +%token TOK_DEFAULT +%token TOK_DIV_EQ +%token TOK_DO +%token TOK_DOT_DOT +%token TOK_DOT_DOT_DOT +%token TOK_ELSE +%token TOK_EXTERN +%token TOK_FLOAT_ID +%token TOK_FOR +%token TOK_FUNCTION_ID +%token TOK_GAUGE +%token TOK_IDENTIFIER +%token TOK_IF +%token TOK_IMPORT +%token TOK_INHERIT +%token TOK_INLINE +%token TOK_LOCAL_ID +%token TOK_FINAL_ID +%token TOK_INT_ID +%token TOK_LAMBDA +%token TOK_MULTISET_ID +%token TOK_MULTISET_END +%token TOK_MULTISET_START +%token TOK_LSH_EQ +%token TOK_MAPPING_ID +%token TOK_MIXED_ID +%token TOK_MOD_EQ +%token TOK_MULT_EQ +%token TOK_NO_MASK +%token TOK_OBJECT_ID +%token TOK_OR_EQ +%token TOK_PRIVATE +%token TOK_PROGRAM_ID +%token TOK_PROTECTED +%token TOK_PREDEF +%token TOK_PUBLIC +%token TOK_RSH_EQ +%token TOK_STATIC +%token TOK_STRING_ID +%token TOK_SUB_EQ +%token TOK_TYPEOF +%token TOK_VOID_ID +%token TOK_WHILE +%token TOK_XOR_EQ +%token TOK_OPTIONAL + %right '=' %right '?' -%left F_LOR -%left F_LAND +%left TOK_LOR +%left TOK_LAND %left '|' %left '^' %left '&' -%left F_EQ F_NE -%left '>' F_GE '<' F_LE /* nonassoc? */ -%left F_LSH F_RSH +%left TOK_EQ TOK_NE +%left '>' TOK_GE '<' TOK_LE /* nonassoc? */ +%left TOK_LSH TOK_RSH %left '+' '-' %left '*' '%' '/' -%right F_NOT '~' -%nonassoc F_INC F_DEC +%right TOK_NOT '~' +%nonassoc TOK_INC TOK_DEC %{ /* This is the grammar definition of Pike. */ #include "global.h" -RCSID("$Id: language.yacc,v 1.184 2000/05/09 01:17:59 hubbe Exp $"); +RCSID("$Id: language.yacc,v 1.185 2000/05/11 14:09:45 grubba Exp $"); #ifdef HAVE_MEMORY_H #include <memory.h> #endif @@ -214,6 +128,7 @@ RCSID("$Id: language.yacc,v 1.184 2000/05/09 01:17:59 hubbe Exp $"); #include "docode.h" #include "machine.h" #include "main.h" +#include "opcodes.h" #define YYMAXDEPTH 1000 @@ -270,44 +185,44 @@ int yylex(YYSTYPE *yylval); #endif /* YYBISON */ %} -%type <fnum> F_FLOAT - -%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 <fnum> TOK_FLOAT + +%type <number> TOK_ARRAY_ID +%type <number> TOK_BREAK +%type <number> TOK_CASE +%type <number> TOK_CATCH +%type <number> TOK_CONTINUE +%type <number> TOK_DEFAULT +%type <number> TOK_DO +%type <number> TOK_ELSE +%type <number> TOK_FLOAT_ID +%type <number> TOK_FOR +%type <number> TOK_FOREACH +%type <number> TOK_FUNCTION_ID +%type <number> TOK_GAUGE +%type <number> TOK_IF +%type <number> TOK_INHERIT +%type <number> TOK_INLINE +%type <number> TOK_INT_ID +%type <number> TOK_LAMBDA +%type <number> TOK_LOCAL_ID +%type <number> TOK_MAPPING_ID +%type <number> TOK_MIXED_ID +%type <number> TOK_MULTISET_ID +%type <number> TOK_NO_MASK +%type <number> TOK_OBJECT_ID +%type <number> TOK_PREDEF +%type <number> TOK_PRIVATE +%type <number> TOK_PROGRAM_ID +%type <number> TOK_PROTECTED +%type <number> TOK_PUBLIC +%type <number> TOK_RETURN +%type <number> TOK_SSCANF +%type <number> TOK_STATIC +%type <number> TOK_STRING_ID +%type <number> TOK_SWITCH +%type <number> TOK_VOID_ID +%type <number> TOK_WHILE %type <number> arguments %type <number> arguments2 %type <number> func_args @@ -337,11 +252,11 @@ int yylex(YYSTYPE *yylval); %type <n> simple_identifier_type %type <n> string_constant %type <n> string -%type <n> F_STRING -%type <n> F_NUMBER +%type <n> TOK_STRING +%type <n> TOK_NUMBER %type <n> optional_rename_inherit %type <n> optional_identifier -%type <n> F_IDENTIFIER +%type <n> TOK_IDENTIFIER %type <n> assoc_pair %type <n> block %type <n> failsafe_block @@ -405,8 +320,8 @@ int yylex(YYSTYPE *yylval); %% all: program { YYACCEPT; } - | program F_LEX_EOF { YYACCEPT; } -/* | error F_LEX_EOF { YYABORT; } */ + | program TOK_LEX_EOF { YYACCEPT; } +/* | error TOK_LEX_EOF { YYABORT; } */ ; program: program def optional_semi_colons @@ -432,7 +347,7 @@ string_constant: string } ; -optional_rename_inherit: ':' F_IDENTIFIER { $$=$2; } +optional_rename_inherit: ':' TOK_IDENTIFIER { $$=$2; } | ':' bad_identifier { $$=0; } | ':' error { $$=0; } | { $$=0; } @@ -483,7 +398,7 @@ program_ref: low_program_ref } ; -inheritance: modifiers F_INHERIT low_program_ref optional_rename_inherit ';' +inheritance: modifiers TOK_INHERIT low_program_ref optional_rename_inherit ';' { if (($1 & ID_EXTERN) && (compiler_pass == 1)) { yywarning("Extern declared inherit."); @@ -498,37 +413,37 @@ inheritance: modifiers F_INHERIT low_program_ref optional_rename_inherit ';' pop_n_elems(1); free_node($3); } - | modifiers F_INHERIT low_program_ref error ';' + | modifiers TOK_INHERIT low_program_ref error ';' { free_node($3); yyerrok; } - | modifiers F_INHERIT low_program_ref error F_LEX_EOF + | modifiers TOK_INHERIT low_program_ref error TOK_LEX_EOF { free_node($3); yyerror("Missing ';'."); yyerror("Unexpected end of file."); } - | modifiers F_INHERIT low_program_ref error '}' + | modifiers TOK_INHERIT low_program_ref error '}' { free_node($3); yyerror("Missing ';'."); } - | modifiers F_INHERIT error ';' { yyerrok; } - | modifiers F_INHERIT error F_LEX_EOF + | modifiers TOK_INHERIT error ';' { yyerrok; } + | modifiers TOK_INHERIT error TOK_LEX_EOF { yyerror("Missing ';'."); yyerror("Unexpected end of file."); } - | modifiers F_INHERIT error '}' { yyerror("Missing ';'."); } + | modifiers TOK_INHERIT error '}' { yyerror("Missing ';'."); } ; -import: F_IMPORT idents ';' +import: TOK_IMPORT idents ';' { resolv_constant($2); free_node($2); use_module(sp-1); pop_stack(); } - | F_IMPORT string ';' + | TOK_IMPORT string ';' { ref_push_string($2->u.sval.u.string); free_node($2); @@ -542,16 +457,16 @@ import: F_IMPORT idents ';' use_module(sp-1); pop_stack(); } - | F_IMPORT error ';' { yyerrok; } - | F_IMPORT error F_LEX_EOF + | TOK_IMPORT error ';' { yyerrok; } + | TOK_IMPORT error TOK_LEX_EOF { yyerror("Missing ';'."); yyerror("Unexpected end of file."); } - | F_IMPORT error '}' { yyerror("Missing ';'."); } + | TOK_IMPORT error '}' { yyerror("Missing ';'."); } ; -constant_name: F_IDENTIFIER '=' safe_expr0 +constant_name: TOK_IDENTIFIER '=' safe_expr0 { int tmp; /* This can be made more lenient in the future */ @@ -597,14 +512,14 @@ constant_list: constant_name | constant_list ',' constant_name ; -constant: modifiers F_CONSTANT constant_list ';' {} - | modifiers F_CONSTANT error ';' { yyerrok; } - | modifiers F_CONSTANT error F_LEX_EOF +constant: modifiers TOK_CONSTANT constant_list ';' {} + | modifiers TOK_CONSTANT error ';' { yyerrok; } + | modifiers TOK_CONSTANT error TOK_LEX_EOF { yyerror("Missing ';'."); yyerror("Unexpected end of file."); } - | modifiers F_CONSTANT error '}' { yyerror("Missing ';'."); } + | modifiers TOK_CONSTANT error '}' { yyerror("Missing ';'."); } ; block_or_semi: block @@ -612,7 +527,7 @@ block_or_semi: block $$ = check_node_hash(mknode(F_COMMA_EXPR,$1,mknode(F_RETURN,mkintnode(0),0))); } | ';' { $$ = NULL; } - | F_LEX_EOF { yyerror("Expected ';'."); $$ = NULL; } + | TOK_LEX_EOF { yyerror("Expected ';'."); $$ = NULL; } | error { $$ = NULL; } ; @@ -673,7 +588,7 @@ push_compiler_frame0: /* empty */ } ; -def: modifiers type_or_error optional_stars F_IDENTIFIER push_compiler_frame0 +def: modifiers type_or_error optional_stars TOK_IDENTIFIER push_compiler_frame0 '(' arguments close_paren_or_missing { int e; @@ -802,7 +717,7 @@ def: modifiers type_or_error optional_stars F_IDENTIFIER push_compiler_frame0 free_node($8); free_node($<n>9); } - | modifiers type_or_error optional_stars F_IDENTIFIER push_compiler_frame0 + | modifiers type_or_error optional_stars TOK_IDENTIFIER push_compiler_frame0 error { pop_compiler_frame(); @@ -821,7 +736,7 @@ def: modifiers type_or_error optional_stars F_IDENTIFIER push_compiler_frame0 | import {} | constant {} | class { free_node($1); } - | error F_LEX_EOF + | error TOK_LEX_EOF { reset_type_stack(); yyerror("Missing ';'."); @@ -852,11 +767,11 @@ def: modifiers type_or_error optional_stars F_IDENTIFIER push_compiler_frame0 } ; -optional_dot_dot_dot: F_DOT_DOT_DOT { $$=1; } +optional_dot_dot_dot: TOK_DOT_DOT_DOT { $$=1; } | /* empty */ { $$=0; } ; -optional_identifier: F_IDENTIFIER +optional_identifier: TOK_IDENTIFIER | bad_identifier { $$=0; } | /* empty */ { $$=0; } ; @@ -909,73 +824,73 @@ arguments2: new_arg_name { $$ = 1; } } ; -modifier: F_NO_MASK { $$ = ID_NOMASK; } - | F_FINAL_ID { $$ = ID_NOMASK; } - | F_STATIC { $$ = ID_STATIC; } - | F_EXTERN { $$ = ID_EXTERN; } - | F_OPTIONAL { $$ = ID_OPTIONAL; } - | F_PRIVATE { $$ = ID_PRIVATE | ID_STATIC; } - | F_LOCAL_ID { $$ = ID_INLINE; } - | F_PUBLIC { $$ = ID_PUBLIC; } - | F_PROTECTED { $$ = ID_PROTECTED; } - | F_INLINE { $$ = ID_INLINE; } +modifier: TOK_NO_MASK { $$ = ID_NOMASK; } + | TOK_FINAL_ID { $$ = ID_NOMASK; } + | TOK_STATIC { $$ = ID_STATIC; } + | TOK_EXTERN { $$ = ID_EXTERN; } + | TOK_OPTIONAL { $$ = ID_OPTIONAL; } + | TOK_PRIVATE { $$ = ID_PRIVATE | ID_STATIC; } + | TOK_LOCAL_ID { $$ = ID_INLINE; } + | TOK_PUBLIC { $$ = ID_PUBLIC; } + | TOK_PROTECTED { $$ = ID_PROTECTED; } + | TOK_INLINE { $$ = ID_INLINE; } ; magic_identifiers1: - F_NO_MASK { $$ = "nomask"; } - | F_FINAL_ID { $$ = "final"; } - | F_STATIC { $$ = "static"; } - | F_EXTERN { $$ = "extern"; } - | F_PRIVATE { $$ = "private"; } - | F_LOCAL_ID { $$ = "local"; } - | F_PUBLIC { $$ = "public"; } - | F_PROTECTED { $$ = "protected"; } - | F_INLINE { $$ = "inline"; } - | F_OPTIONAL { $$ = "optional"; } + TOK_NO_MASK { $$ = "nomask"; } + | TOK_FINAL_ID { $$ = "final"; } + | TOK_STATIC { $$ = "static"; } + | TOK_EXTERN { $$ = "extern"; } + | TOK_PRIVATE { $$ = "private"; } + | TOK_LOCAL_ID { $$ = "local"; } + | TOK_PUBLIC { $$ = "public"; } + | TOK_PROTECTED { $$ = "protected"; } + | TOK_INLINE { $$ = "inline"; } + | TOK_OPTIONAL { $$ = "optional"; } ; magic_identifiers2: - F_VOID_ID { $$ = "void"; } - | F_MIXED_ID { $$ = "mixed"; } - | F_ARRAY_ID { $$ = "array"; } - | F_MAPPING_ID { $$ = "mapping"; } - | F_MULTISET_ID { $$ = "multiset"; } - | F_OBJECT_ID { $$ = "object"; } - | F_FUNCTION_ID { $$ = "function"; } - | F_PROGRAM_ID { $$ = "program"; } - | F_STRING_ID { $$ = "string"; } - | F_FLOAT_ID { $$ = "float"; } - | F_INT_ID { $$ = "int"; } + TOK_VOID_ID { $$ = "void"; } + | TOK_MIXED_ID { $$ = "mixed"; } + | TOK_ARRAY_ID { $$ = "array"; } + | TOK_MAPPING_ID { $$ = "mapping"; } + | TOK_MULTISET_ID { $$ = "multiset"; } + | TOK_OBJECT_ID { $$ = "object"; } + | TOK_FUNCTION_ID { $$ = "function"; } + | TOK_PROGRAM_ID { $$ = "program"; } + | TOK_STRING_ID { $$ = "string"; } + | TOK_FLOAT_ID { $$ = "float"; } + | TOK_INT_ID { $$ = "int"; } ; magic_identifiers3: - F_IF { $$ = "if"; } - | F_DO { $$ = "do"; } - | F_FOR { $$ = "for"; } - | F_WHILE { $$ = "while"; } - | F_ELSE { $$ = "else"; } - | F_FOREACH { $$ = "foreach"; } - | F_CATCH { $$ = "catch"; } - | F_GAUGE { $$ = "gauge"; } - | F_CLASS { $$ = "class"; } - | F_BREAK { $$ = "break"; } - | F_CASE { $$ = "case"; } - | F_CONSTANT { $$ = "constant"; } - | F_CONTINUE { $$ = "continue"; } - | F_DEFAULT { $$ = "default"; } - | F_IMPORT { $$ = "import"; } - | F_INHERIT { $$ = "inherit"; } - | F_LAMBDA { $$ = "lambda"; } - | F_PREDEF { $$ = "predef"; } - | F_RETURN { $$ = "return"; } - | F_SSCANF { $$ = "sscanf"; } - | F_SWITCH { $$ = "switch"; } - | F_TYPEOF { $$ = "typeof"; } + TOK_IF { $$ = "if"; } + | TOK_DO { $$ = "do"; } + | TOK_FOR { $$ = "for"; } + | TOK_WHILE { $$ = "while"; } + | TOK_ELSE { $$ = "else"; } + | TOK_FOREACH { $$ = "foreach"; } + | TOK_CATCH { $$ = "catch"; } + | TOK_GAUGE { $$ = "gauge"; } + | TOK_CLASS { $$ = "class"; } + | TOK_BREAK { $$ = "break"; } + | TOK_CASE { $$ = "case"; } + | TOK_CONSTANT { $$ = "constant"; } + | TOK_CONTINUE { $$ = "continue"; } + | TOK_DEFAULT { $$ = "default"; } + | TOK_IMPORT { $$ = "import"; } + | TOK_INHERIT { $$ = "inherit"; } + | TOK_LAMBDA { $$ = "lambda"; } + | TOK_PREDEF { $$ = "predef"; } + | TOK_RETURN { $$ = "return"; } + | TOK_SSCANF { $$ = "sscanf"; } + | TOK_SWITCH { $$ = "switch"; } + | TOK_TYPEOF { $$ = "typeof"; } ; magic_identifiers: magic_identifiers1 | magic_identifiers2 | magic_identifiers3 ; -magic_identifier: F_IDENTIFIER +magic_identifier: TOK_IDENTIFIER | magic_identifiers { struct pike_string *tmp=make_shared_string($1); @@ -1139,17 +1054,17 @@ type2: type2 '|' type3 { push_type(T_OR); } | type3 ; -type3: F_INT_ID opt_int_range { push_type(T_INT); } - | 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); } - | F_STRING_ID { push_type(T_STRING); } - | F_OBJECT_ID opt_object_type { push_type(T_OBJECT); } - | 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); } +type3: TOK_INT_ID opt_int_range { push_type(T_INT); } + | TOK_FLOAT_ID { push_type(T_FLOAT); } + | TOK_PROGRAM_ID { push_type(T_PROGRAM); } + | TOK_VOID_ID { push_type(T_VOID); } + | TOK_MIXED_ID { push_type(T_MIXED); } + | TOK_STRING_ID { push_type(T_STRING); } + | TOK_OBJECT_ID opt_object_type { push_type(T_OBJECT); } + | TOK_MAPPING_ID opt_mapping_type { push_type(T_MAPPING); } + | TOK_ARRAY_ID opt_array_type { push_type(T_ARRAY); } + | TOK_MULTISET_ID opt_array_type { push_type(T_MULTISET); } + | TOK_FUNCTION_ID opt_function_type { push_type(T_FUNCTION); } ; type8: type3 | identifier_type ; @@ -1158,8 +1073,8 @@ number_or_maxint: /* Empty */ { $$ = mkintnode(MAX_INT32); } - | F_NUMBER - | '-' F_NUMBER + | TOK_NUMBER + | '-' TOK_NUMBER { #ifdef PIKE_DEBUG if (($2->token != F_CONSTANT) || ($2->u.sval.type != T_INT)) { @@ -1175,8 +1090,8 @@ number_or_minint: /* Empty */ { $$ = mkintnode(MIN_INT32); } - | F_NUMBER - | '-' F_NUMBER + | TOK_NUMBER + | '-' TOK_NUMBER { #ifdef PIKE_DEBUG if (($2->token != F_CONSTANT) || ($2->u.sval.type != T_INT)) { @@ -1193,7 +1108,7 @@ opt_int_range: /* Empty */ push_type_int(MAX_INT32); push_type_int(MIN_INT32); } - | '(' number_or_minint F_DOT_DOT number_or_maxint ')' + | '(' number_or_minint TOK_DOT_DOT number_or_maxint ')' { /* FIXME: Check that $4 is >= $2. */ if($2->token == F_CONSTANT && $2->u.sval.type == T_INT) @@ -1338,7 +1253,7 @@ name_list: new_name | name_list ',' new_name ; -new_name: optional_stars F_IDENTIFIER +new_name: optional_stars TOK_IDENTIFIER { struct pike_string *type; push_finished_type(compiler_frame->current_type); @@ -1352,7 +1267,7 @@ new_name: optional_stars F_IDENTIFIER free_node($2); } | optional_stars bad_identifier {} - | optional_stars F_IDENTIFIER '=' + | optional_stars TOK_IDENTIFIER '=' { struct pike_string *type; push_finished_type(compiler_frame->current_type); @@ -1376,11 +1291,11 @@ new_name: optional_stars F_IDENTIFIER mkidentifiernode($<number>4)))); free_node($2); } - | optional_stars F_IDENTIFIER '=' error + | optional_stars TOK_IDENTIFIER '=' error { free_node($2); } - | optional_stars F_IDENTIFIER '=' F_LEX_EOF + | optional_stars TOK_IDENTIFIER '=' TOK_LEX_EOF { yyerror("Unexpected end of file in variable definition."); free_node($2); @@ -1392,7 +1307,7 @@ new_name: optional_stars F_IDENTIFIER ; -new_local_name: optional_stars F_IDENTIFIER +new_local_name: optional_stars TOK_IDENTIFIER { push_finished_type($<n>0->u.sval.u.string); if ($1 && (compiler_pass == 2)) { @@ -1404,7 +1319,7 @@ new_local_name: optional_stars F_IDENTIFIER free_node($2); } | optional_stars bad_identifier { $$=0; } - | optional_stars F_IDENTIFIER '=' expr0 + | optional_stars TOK_IDENTIFIER '=' expr0 { push_finished_type($<n>0->u.sval.u.string); if ($1 && (compiler_pass == 2)) { @@ -1420,13 +1335,13 @@ new_local_name: optional_stars F_IDENTIFIER free_node($4); $$=0; } - | optional_stars F_IDENTIFIER '=' error + | optional_stars TOK_IDENTIFIER '=' error { free_node($2); /* No yyerok here since we aren't done yet. */ $$=0; } - | optional_stars F_IDENTIFIER '=' F_LEX_EOF + | optional_stars TOK_IDENTIFIER '=' TOK_LEX_EOF { yyerror("Unexpected end of file in local variable definition."); free_node($2); @@ -1435,7 +1350,7 @@ new_local_name: optional_stars F_IDENTIFIER } ; -new_local_name2: F_IDENTIFIER +new_local_name2: TOK_IDENTIFIER { add_ref($<n>0->u.sval.u.string); add_local_name($1->u.sval.u.string, $<n>0->u.sval.u.string, 0); @@ -1443,7 +1358,7 @@ new_local_name2: F_IDENTIFIER free_node($1); } | bad_identifier { $$=0; } - | F_IDENTIFIER '=' safe_expr0 + | TOK_IDENTIFIER '=' safe_expr0 { add_ref($<n>0->u.sval.u.string); add_local_name($1->u.sval.u.string, $<n>0->u.sval.u.string, 0); @@ -1467,7 +1382,7 @@ block:'{' ; end_block: '}' - | F_LEX_EOF + | TOK_LEX_EOF { yyerror("Missing '}'."); yyerror("Unexpected end of file."); @@ -1476,7 +1391,7 @@ end_block: '}' failsafe_block: block | error { $$=0; } - | F_LEX_EOF { yyerror("Unexpected end of file."); $$=0; } + | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=0; } ; @@ -1510,7 +1425,7 @@ statement: unused2 ';' | break expected_semicolon | continue expected_semicolon | error ';' { reset_type_stack(); $$=0; yyerrok; } - | error F_LEX_EOF + | error TOK_LEX_EOF { reset_type_stack(); yyerror("Missing ';'."); @@ -1528,15 +1443,15 @@ statement: unused2 ';' ; -break: F_BREAK { $$=mknode(F_BREAK,0,0); } ; -default: F_DEFAULT ':' { $$=mknode(F_DEFAULT,0,0); } - | F_DEFAULT +break: TOK_BREAK { $$=mknode(F_BREAK,0,0); } ; +default: TOK_DEFAULT ':' { $$=mknode(F_DEFAULT,0,0); } + | TOK_DEFAULT { $$=mknode(F_DEFAULT,0,0); yyerror("Expected ':' after default."); } ; -continue: F_CONTINUE { $$=mknode(F_CONTINUE,0,0); } ; +continue: TOK_CONTINUE { $$=mknode(F_CONTINUE,0,0); } ; push_compiler_frame1: /* empty */ { @@ -1544,7 +1459,7 @@ push_compiler_frame1: /* empty */ } ; -lambda: F_LAMBDA push_compiler_frame1 +lambda: TOK_LAMBDA push_compiler_frame1 { debug_malloc_touch(compiler_frame->current_return_type); if(compiler_frame->current_return_type) @@ -1610,13 +1525,13 @@ lambda: F_LAMBDA push_compiler_frame1 free_string(type); pop_compiler_frame(); } - | F_LAMBDA push_compiler_frame1 error + | TOK_LAMBDA push_compiler_frame1 error { pop_compiler_frame(); } ; -local_function: F_IDENTIFIER push_compiler_frame1 func_args +local_function: TOK_IDENTIFIER push_compiler_frame1 func_args { char buf[40]; struct pike_string *name,*type; @@ -1713,14 +1628,14 @@ local_function: F_IDENTIFIER push_compiler_frame1 func_args mklocalnode(localid,0)); } } - | F_IDENTIFIER push_compiler_frame1 error + | TOK_IDENTIFIER push_compiler_frame1 error { pop_compiler_frame(); $$=mkintnode(0); } ; -local_function2: optional_stars F_IDENTIFIER push_compiler_frame1 func_args +local_function2: optional_stars TOK_IDENTIFIER push_compiler_frame1 func_args { char buf[40]; struct pike_string *name,*type; @@ -1826,7 +1741,7 @@ local_function2: optional_stars F_IDENTIFIER push_compiler_frame1 func_args mklocalnode(localid,0)); } } - | optional_stars F_IDENTIFIER push_compiler_frame1 error + | optional_stars TOK_IDENTIFIER push_compiler_frame1 error { pop_compiler_frame(); free_node($2); @@ -1837,13 +1752,13 @@ local_function2: optional_stars F_IDENTIFIER push_compiler_frame1 func_args failsafe_program: '{' program end_block | error { yyerrok; } - | F_LEX_EOF + | TOK_LEX_EOF { yyerror("End of file where program definition expected."); } ; -class: modifiers F_CLASS optional_identifier +class: modifiers TOK_CLASS optional_identifier { extern int num_parse_error; int num_errors=num_parse_error; @@ -1937,7 +1852,7 @@ class: modifiers F_CLASS optional_identifier } ; -cond: F_IF +cond: TOK_IF { $<number>$=compiler_frame->current_number_of_locals; } @@ -1953,7 +1868,7 @@ cond: F_IF end_cond: ')' | '}' { yyerror("Missing ')'."); } - | F_LEX_EOF + | TOK_LEX_EOF { yyerror("Missing ')'."); yyerror("Unexpected end of file."); @@ -1961,7 +1876,7 @@ end_cond: ')' ; optional_else_part: { $$=0; } - | F_ELSE statement { $$=$2; } + | TOK_ELSE statement { $$=$2; } ; safe_lvalue: lvalue @@ -1969,11 +1884,11 @@ safe_lvalue: lvalue ; safe_expr0: expr0 - | F_LEX_EOF { yyerror("Unexpected end of file."); $$=0; } + | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=0; } | error { $$=0; } ; -foreach: F_FOREACH +foreach: TOK_FOREACH { $<number>$=compiler_frame->current_number_of_locals; } @@ -1991,18 +1906,18 @@ foreach: F_FOREACH } ; -do: F_DO statement F_WHILE '(' safe_comma_expr end_cond expected_semicolon +do: TOK_DO statement TOK_WHILE '(' safe_comma_expr end_cond expected_semicolon { $$=mknode(F_DO,$2,$5); $$->line_number=$1; } - | F_DO statement F_WHILE F_LEX_EOF + | TOK_DO statement TOK_WHILE TOK_LEX_EOF { $$=0; yyerror("Missing '(' in do-while loop."); yyerror("Unexpected end of file."); } - | F_DO statement F_LEX_EOF + | TOK_DO statement TOK_LEX_EOF { $$=0; yyerror("Missing 'while' in do-while loop."); @@ -2011,14 +1926,14 @@ do: F_DO statement F_WHILE '(' safe_comma_expr end_cond expected_semicolon ; expected_semicolon: ';' - | F_LEX_EOF + | TOK_LEX_EOF { yyerror("Missing ';'."); yyerror("Unexpected end of file."); } ; -for: F_FOR +for: TOK_FOR { $<number>$=compiler_frame->current_number_of_locals; } @@ -2035,7 +1950,7 @@ for: F_FOR ; -while: F_WHILE +while: TOK_WHILE { $<number>$=compiler_frame->current_number_of_locals; } @@ -2053,7 +1968,7 @@ for_expr: /* EMPTY */ { $$=mkintnode(1); } | safe_comma_expr ; -switch: F_SWITCH +switch: TOK_SWITCH { $<number>$=compiler_frame->current_number_of_locals; } @@ -2065,11 +1980,11 @@ switch: F_SWITCH } ; -case: F_CASE safe_comma_expr expected_colon +case: TOK_CASE safe_comma_expr expected_colon { $$=mknode(F_CASE,$2,0); } - | F_CASE safe_comma_expr F_DOT_DOT optional_comma_expr expected_colon + | TOK_CASE safe_comma_expr TOK_DOT_DOT optional_comma_expr expected_colon { $$=mknode(F_CASE,$4?$2:0,$4?$4:$2); } @@ -2088,14 +2003,14 @@ expected_colon: ':' { yyerror("Missing ':'."); } - | F_LEX_EOF + | TOK_LEX_EOF { yyerror("Missing ':'."); yyerror("Unexpected end of file."); } ; -return: F_RETURN +return: TOK_RETURN { if(!match_types(compiler_frame->current_return_type, void_type_string)) @@ -2104,7 +2019,7 @@ return: F_RETURN } $$=mknode(F_RETURN,mkintnode(0),0); } - | F_RETURN safe_comma_expr + | TOK_RETURN safe_comma_expr { $$=mknode(F_RETURN,$2,0); } @@ -2159,16 +2074,16 @@ expr01: expr1 | expr1 '?' expr01 ':' expr01 { $$=mknode('?',$1,mknode(':',$3,$5)); } ; -assign: F_AND_EQ { $$=F_AND_EQ; } - | 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; } +assign: TOK_AND_EQ { $$=F_AND_EQ; } + | TOK_OR_EQ { $$=F_OR_EQ; } + | TOK_XOR_EQ { $$=F_XOR_EQ; } + | TOK_LSH_EQ { $$=F_LSH_EQ; } + | TOK_RSH_EQ { $$=F_RSH_EQ; } + | TOK_ADD_EQ { $$=F_ADD_EQ; } + | TOK_SUB_EQ { $$=F_SUB_EQ; } + | TOK_MULT_EQ{ $$=F_MULT_EQ; } + | TOK_MOD_EQ { $$=F_MOD_EQ; } + | TOK_DIV_EQ { $$=F_DIV_EQ; } ; optional_comma: { $$=0; } | ',' { $$=1; }; @@ -2204,37 +2119,37 @@ assoc_pair: expr0 expected_colon expr1 { $$=mknode(F_ARG_LIST,$1,$3); } ; expr1: expr2 - | expr1 F_LOR expr1 { $$=mknode(F_LOR,$1,$3); } - | expr1 F_LAND expr1 { $$=mknode(F_LAND,$1,$3); } + | expr1 TOK_LOR expr1 { $$=mknode(F_LOR,$1,$3); } + | expr1 TOK_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 TOK_EQ expr1 { $$=mkopernode("`==",$1,$3); } + | expr1 TOK_NE expr1 { $$=mkopernode("`!=",$1,$3); } | expr1 '>' expr1 { $$=mkopernode("`>",$1,$3); } - | expr1 F_GE expr1 { $$=mkopernode("`>=",$1,$3); } + | expr1 TOK_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 TOK_LE expr1 { $$=mkopernode("`<=",$1,$3); } + | expr1 TOK_LSH expr1 { $$=mkopernode("`<<",$1,$3); } + | expr1 TOK_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); } - | expr1 F_LOR error - | expr1 F_LAND error + | expr1 TOK_LOR error + | expr1 TOK_LAND error | expr1 '|' error | expr1 '^' error | expr1 '&' error - | expr1 F_EQ error - | expr1 F_NE error + | expr1 TOK_EQ error + | expr1 TOK_NE error | expr1 '>' error - | expr1 F_GE error + | expr1 TOK_GE error | expr1 '<' error - | expr1 F_LE error - | expr1 F_LSH error - | expr1 F_RSH error + | expr1 TOK_LE error + | expr1 TOK_LSH error + | expr1 TOK_RSH error | expr1 '+' error | expr1 '-' error | expr1 '*' error @@ -2253,21 +2168,21 @@ expr2: expr3 $$=mksoftcastnode($1->u.sval.u.string,$2); free_node($1); } - | F_INC expr4 { $$=mknode(F_INC,$2,0); } - | F_DEC expr4 { $$=mknode(F_DEC,$2,0); } - | F_NOT expr2 { $$=mkopernode("`!",$2,0); } + | TOK_INC expr4 { $$=mknode(F_INC,$2,0); } + | TOK_DEC expr4 { $$=mknode(F_DEC,$2,0); } + | TOK_NOT expr2 { $$=mkopernode("`!",$2,0); } | '~' expr2 { $$=mkopernode("`~",$2,0); } | '-' expr2 { $$=mkopernode("`-",$2,0); } ; expr3: expr4 - | expr4 F_INC { $$=mknode(F_POST_INC,$1,0); } - | expr4 F_DEC { $$=mknode(F_POST_DEC,$1,0); } + | expr4 TOK_INC { $$=mknode(F_POST_INC,$1,0); } + | expr4 TOK_DEC { $$=mknode(F_POST_DEC,$1,0); } ; expr4: string - | F_NUMBER - | F_FLOAT { $$=mkfloatnode((FLOAT_TYPE)$1); } + | TOK_NUMBER + | TOK_FLOAT { $$=mkfloatnode((FLOAT_TYPE)$1); } | catch | gauge | typeof @@ -2277,7 +2192,7 @@ expr4: string | idents | expr4 '(' expr_list ')' { $$=mkapplynode($1,$3); } | expr4 '(' error ')' { $$=mkapplynode($1, NULL); yyerrok; } - | expr4 '(' error F_LEX_EOF + | expr4 '(' error TOK_LEX_EOF { yyerror("Missing ')'."); $$=mkapplynode($1, NULL); yyerror("Unexpected end of file."); @@ -2285,12 +2200,12 @@ expr4: string | expr4 '(' error ';' { yyerror("Missing ')'."); $$=mkapplynode($1, NULL); } | expr4 '(' error '}' { yyerror("Missing ')'."); $$=mkapplynode($1, NULL); } | expr4 '[' expr0 ']' { $$=mknode(F_INDEX,$1,$3); } - | expr4 '[' comma_expr_or_zero F_DOT_DOT comma_expr_or_maxint ']' + | expr4 '[' comma_expr_or_zero TOK_DOT_DOT comma_expr_or_maxint ']' { $$=mknode(F_RANGE,$1,mknode(F_ARG_LIST,$3,$5)); } | expr4 '[' error ']' { $$=$1; yyerrok; } - | expr4 '[' error F_LEX_EOF + | expr4 '[' error TOK_LEX_EOF { $$=$1; yyerror("Missing ']'."); yyerror("Unexpected end of file."); @@ -2303,42 +2218,42 @@ expr4: string { $$=mkefuncallnode("aggregate",$3); } | '(' '[' m_expr_list close_bracket_or_missing ')' { $$=mkefuncallnode("aggregate_mapping",$3); } - | F_MULTISET_START expr_list F_MULTISET_END + | TOK_MULTISET_START expr_list TOK_MULTISET_END { $$=mkefuncallnode("aggregate_multiset",$2); } - | F_MULTISET_START expr_list ')' + | TOK_MULTISET_START expr_list ')' { yyerror("Missing '>'."); $$=mkefuncallnode("aggregate_multiset",$2); } | '(' error ')' { $$=0; yyerrok; } - | '(' error F_LEX_EOF + | '(' error TOK_LEX_EOF { $$=0; yyerror("Missing ')'."); yyerror("Unexpected end of file."); } | '(' error ';' { $$=0; yyerror("Missing ')'."); } | '(' error '}' { $$=0; yyerror("Missing ')'."); } - | F_MULTISET_START error F_MULTISET_END { $$=0; yyerrok; } - | F_MULTISET_START error ')' { + | TOK_MULTISET_START error TOK_MULTISET_END { $$=0; yyerrok; } + | TOK_MULTISET_START error ')' { yyerror("Missing '>'."); $$=0; yyerrok; } - | F_MULTISET_START error F_LEX_EOF + | TOK_MULTISET_START error TOK_LEX_EOF { $$=0; yyerror("Missing '>)'."); yyerror("Unexpected end of file."); } - | F_MULTISET_START error ';' { $$=0; yyerror("Missing '>)'."); } - | F_MULTISET_START error '}' { $$=0; yyerror("Missing '>)'."); } - | expr4 F_ARROW magic_identifier + | TOK_MULTISET_START error ';' { $$=0; yyerror("Missing '>)'."); } + | TOK_MULTISET_START error '}' { $$=0; yyerror("Missing '>)'."); } + | expr4 TOK_ARROW magic_identifier { $$=mknode(F_ARROW,$1,$3); } - | expr4 F_ARROW error {} + | expr4 TOK_ARROW error {} ; idents: low_idents - | idents '.' F_IDENTIFIER + | idents '.' TOK_IDENTIFIER { $$=index_node($1, last_identifier?last_identifier->str:NULL, $3->u.sval.u.string); @@ -2347,7 +2262,7 @@ idents: low_idents copy_shared_string(last_identifier, $3->u.sval.u.string); free_node($3); } - | '.' F_IDENTIFIER + | '.' TOK_IDENTIFIER { node *tmp; push_text("."); @@ -2370,7 +2285,7 @@ idents: low_idents | idents '.' error {} ; -low_idents: F_IDENTIFIER +low_idents: TOK_IDENTIFIER { int i; struct efun *f; @@ -2398,7 +2313,7 @@ low_idents: F_IDENTIFIER } free_node($1); } - | F_PREDEF F_COLON_COLON F_IDENTIFIER + | TOK_PREDEF TOK_COLON_COLON TOK_IDENTIFIER { struct svalue tmp; node *tmp2; @@ -2416,11 +2331,11 @@ low_idents: F_IDENTIFIER free_node(tmp2); free_node($3); } - | F_PREDEF F_COLON_COLON bad_identifier + | TOK_PREDEF TOK_COLON_COLON bad_identifier { $$=0; } - | F_IDENTIFIER F_COLON_COLON F_IDENTIFIER + | TOK_IDENTIFIER TOK_COLON_COLON TOK_IDENTIFIER { if(last_identifier) free_string(last_identifier); copy_shared_string(last_identifier, $3->u.sval.u.string); @@ -2439,9 +2354,9 @@ low_idents: F_IDENTIFIER free_node($1); free_node($3); } - | F_IDENTIFIER F_COLON_COLON bad_identifier - | F_IDENTIFIER F_COLON_COLON error - | F_COLON_COLON F_IDENTIFIER + | TOK_IDENTIFIER TOK_COLON_COLON bad_identifier + | TOK_IDENTIFIER TOK_COLON_COLON error + | TOK_COLON_COLON TOK_IDENTIFIER { int e,i; @@ -2482,7 +2397,7 @@ low_idents: F_IDENTIFIER } free_node($2); } - | F_COLON_COLON bad_identifier + | TOK_COLON_COLON bad_identifier { $$=0; } @@ -2490,15 +2405,15 @@ low_idents: F_IDENTIFIER comma_expr_or_zero: /* empty */ { $$=mkintnode(0); } | comma_expr - | F_LEX_EOF { yyerror("Unexpected end of file."); $$=0; } + | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=0; } ; comma_expr_or_maxint: /* empty */ { $$=mkintnode(0x7fffffff); } | comma_expr - | F_LEX_EOF { yyerror("Unexpected end of file."); $$=mkintnode(0x7fffffff); } + | TOK_LEX_EOF { yyerror("Unexpected end of file."); $$=mkintnode(0x7fffffff); } ; -gauge: F_GAUGE catch_arg +gauge: TOK_GAUGE catch_arg { #ifdef HAVE_GETHRVTIME $$=mkefuncallnode("abs", @@ -2520,7 +2435,7 @@ gauge: F_GAUGE catch_arg #endif }; -typeof: F_TYPEOF '(' expr0 ')' +typeof: TOK_TYPEOF '(' expr0 ')' { struct pike_string *s; node *tmp; @@ -2534,19 +2449,19 @@ typeof: F_TYPEOF '(' expr0 ')' free_string(s); free_node(tmp); } - | F_TYPEOF '(' error ')' { $$=0; yyerrok; } - | F_TYPEOF '(' error '}' { $$=0; yyerror("Missing ')'."); } - | F_TYPEOF '(' error F_LEX_EOF + | TOK_TYPEOF '(' error ')' { $$=0; yyerrok; } + | TOK_TYPEOF '(' error '}' { $$=0; yyerror("Missing ')'."); } + | TOK_TYPEOF '(' error TOK_LEX_EOF { $$=0; yyerror("Missing ')'."); yyerror("Unexpected end of file."); } - | F_TYPEOF '(' error ';' { $$=0; yyerror("Missing ')'."); } + | TOK_TYPEOF '(' error ';' { $$=0; yyerror("Missing ')'."); } ; catch_arg: '(' comma_expr ')' { $$=$2; } | '(' error ')' { $$=0; yyerrok; } - | '(' error F_LEX_EOF + | '(' error TOK_LEX_EOF { $$=0; yyerror("Missing ')'."); yyerror("Unexpected end of file."); @@ -2557,7 +2472,7 @@ catch_arg: '(' comma_expr ')' { $$=$2; } | error { $$=0; yyerror("Bad expression for catch."); } ; -catch: F_CATCH +catch: TOK_CATCH { catch_level++; } @@ -2568,18 +2483,18 @@ catch: F_CATCH } ; -sscanf: F_SSCANF '(' expr0 ',' expr0 lvalue_list ')' +sscanf: TOK_SSCANF '(' expr0 ',' expr0 lvalue_list ')' { $$=mknode(F_SSCANF,mknode(F_ARG_LIST,$3,$5),$6); } - | F_SSCANF '(' expr0 ',' expr0 error ')' + | TOK_SSCANF '(' expr0 ',' expr0 error ')' { $$=0; free_node($3); free_node($5); yyerrok; } - | F_SSCANF '(' expr0 ',' expr0 error F_LEX_EOF + | TOK_SSCANF '(' expr0 ',' expr0 error TOK_LEX_EOF { $$=0; free_node($3); @@ -2587,58 +2502,58 @@ sscanf: F_SSCANF '(' expr0 ',' expr0 lvalue_list ')' yyerror("Missing ')'."); yyerror("Unexpected end of file."); } - | F_SSCANF '(' expr0 ',' expr0 error '}' + | TOK_SSCANF '(' expr0 ',' expr0 error '}' { $$=0; free_node($3); free_node($5); yyerror("Missing ')'."); } - | F_SSCANF '(' expr0 ',' expr0 error ';' + | TOK_SSCANF '(' expr0 ',' expr0 error ';' { $$=0; free_node($3); free_node($5); yyerror("Missing ')'."); } - | F_SSCANF '(' expr0 error ')' + | TOK_SSCANF '(' expr0 error ')' { $$=0; free_node($3); yyerrok; } - | F_SSCANF '(' expr0 error F_LEX_EOF + | TOK_SSCANF '(' expr0 error TOK_LEX_EOF { $$=0; free_node($3); yyerror("Missing ')'."); yyerror("Unexpected end of file."); } - | F_SSCANF '(' expr0 error '}' + | TOK_SSCANF '(' expr0 error '}' { $$=0; free_node($3); yyerror("Missing ')'."); } - | F_SSCANF '(' expr0 error ';' + | TOK_SSCANF '(' expr0 error ';' { $$=0; free_node($3); yyerror("Missing ')'."); } - | F_SSCANF '(' error ')' { $$=0; yyerrok; } - | F_SSCANF '(' error F_LEX_EOF + | TOK_SSCANF '(' error ')' { $$=0; yyerrok; } + | TOK_SSCANF '(' error TOK_LEX_EOF { $$=0; yyerror("Missing ')'."); yyerror("Unexpected end of file."); } - | F_SSCANF '(' error '}' { $$=0; yyerror("Missing ')'."); } - | F_SSCANF '(' error ';' { $$=0; yyerror("Missing ')'."); } + | TOK_SSCANF '(' error '}' { $$=0; yyerror("Missing ')'."); } + | TOK_SSCANF '(' error ';' { $$=0; yyerror("Missing ')'."); } ; lvalue: expr4 | '[' low_lvalue_list ']' { $$=mknode(F_ARRAY_LVALUE, $2,0); } - | type6 F_IDENTIFIER + | type6 TOK_IDENTIFIER { add_local_name($2->u.sval.u.string,compiler_pop_type(),0); $$=mklocalnode(islocal($2->u.sval.u.string),0); @@ -2654,8 +2569,8 @@ lvalue_list: /* empty */ { $$ = 0; } | ',' lvalue lvalue_list { $$ = mknode(F_LVALUE_LIST,$2,$3); } ; -string: F_STRING - | string F_STRING +string: TOK_STRING + | string TOK_STRING { struct pike_string *a,*b; copy_shared_string(a,$1->u.sval.u.string); @@ -2674,92 +2589,92 @@ string: F_STRING /* FIXME: Should probably set last_identifier. */ bad_identifier: bad_expr_ident - | F_CLASS + | TOK_CLASS { yyerror("class is a reserved word."); } - | F_ARRAY_ID + | TOK_ARRAY_ID { yyerror("array is a reserved word."); } - | F_FLOAT_ID + | TOK_FLOAT_ID { yyerror("float is a reserved word.");} - | F_FUNCTION_ID + | TOK_FUNCTION_ID { yyerror("function is a reserved word.");} - | F_INT_ID + | TOK_INT_ID { yyerror("int is a reserved word."); } - | F_MAPPING_ID + | TOK_MAPPING_ID { yyerror("mapping is a reserved word."); } - | F_MIXED_ID + | TOK_MIXED_ID { yyerror("mixed is a reserved word."); } - | F_MULTISET_ID + | TOK_MULTISET_ID { yyerror("multiset is a reserved word."); } - | F_OBJECT_ID + | TOK_OBJECT_ID { yyerror("object is a reserved word."); } - | F_PROGRAM_ID + | TOK_PROGRAM_ID { yyerror("program is a reserved word."); } - | F_STRING_ID + | TOK_STRING_ID { yyerror("string is a reserved word."); } - | F_VOID_ID + | TOK_VOID_ID { yyerror("void is a reserved word."); } ; bad_expr_ident: - F_INLINE + TOK_INLINE { yyerror("inline is a reserved word."); } - | F_LOCAL_ID + | TOK_LOCAL_ID { yyerror("local is a reserved word."); } - | F_NO_MASK + | TOK_NO_MASK { yyerror("nomask is a reserved word."); } - | F_PREDEF + | TOK_PREDEF { yyerror("predef is a reserved word."); } - | F_PRIVATE + | TOK_PRIVATE { yyerror("private is a reserved word."); } - | F_PROTECTED + | TOK_PROTECTED { yyerror("protected is a reserved word."); } - | F_PUBLIC + | TOK_PUBLIC { yyerror("public is a reserved word."); } - | F_OPTIONAL + | TOK_OPTIONAL { yyerror("optional is a reserved word."); } - | F_STATIC + | TOK_STATIC { yyerror("static is a reserved word."); } - | F_EXTERN + | TOK_EXTERN { yyerror("extern is a reserved word."); } - | F_FINAL_ID + | TOK_FINAL_ID { yyerror("final is a reserved word.");} - | F_DO + | TOK_DO { yyerror("do is a reserved word."); } - | F_ELSE + | TOK_ELSE { yyerror("else without if."); } - | F_RETURN + | TOK_RETURN { yyerror("return is a reserved word."); } - | F_CONSTANT + | TOK_CONSTANT { yyerror("constant is a reserved word."); } - | F_IMPORT + | TOK_IMPORT { yyerror("import is a reserved word."); } - | F_INHERIT + | TOK_INHERIT { yyerror("inherit is a reserved word."); } - | F_CATCH + | TOK_CATCH { yyerror("catch is a reserved word."); } - | F_GAUGE + | TOK_GAUGE { yyerror("gauge is a reserved word."); } - | F_LAMBDA + | TOK_LAMBDA { yyerror("lambda is a reserved word."); } - | F_SSCANF + | TOK_SSCANF { yyerror("sscanf is a reserved word."); } - | F_SWITCH + | TOK_SWITCH { yyerror("switch is a reserved word."); } - | F_TYPEOF + | TOK_TYPEOF { yyerror("typeof is a reserved word."); } - | F_BREAK + | TOK_BREAK { yyerror("break is a reserved word."); } - | F_CASE + | TOK_CASE { yyerror("case is a reserved word."); } - | F_CONTINUE + | TOK_CONTINUE { yyerror("continue is a reserved word."); } - | F_DEFAULT + | TOK_DEFAULT { yyerror("default is a reserved word."); } - | F_FOR + | TOK_FOR { yyerror("for is a reserved word."); } - | F_FOREACH + | TOK_FOREACH { yyerror("foreach is a reserved word."); } - | F_IF + | TOK_IF { yyerror("if is a reserved word."); } ; diff --git a/src/las.c b/src/las.c index 7a3cfb7f33..1949e74d50 100644 --- a/src/las.c +++ b/src/las.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: las.c,v 1.178 2000/05/09 01:17:59 hubbe Exp $"); +RCSID("$Id: las.c,v 1.179 2000/05/11 14:09:45 grubba Exp $"); #include "language.h" #include "interpret.h" @@ -30,6 +30,7 @@ RCSID("$Id: las.c,v 1.178 2000/05/09 01:17:59 hubbe Exp $"); #include "builtin_functions.h" #include "cyclic.h" #include "block_alloc.h" +#include "opcodes.h" #define LASDEBUG @@ -484,7 +485,7 @@ node *debug_check_node_hash(node *n) fprintf(stderr,"Bad node hash at %p, (%s:%d) (token=%d).\n", n, n->current_file->str, n->line_number, n->token); - debug_malloc_dump_references(n); + debug_malloc_dump_references(n,0,0,0); print_tree(n); fatal("Bad node hash!\n"); } diff --git a/src/lex.c b/src/lex.c index 3b68bb14fc..1acd747251 100644 --- a/src/lex.c +++ b/src/lex.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: lex.c,v 1.79 2000/05/01 02:11:25 hubbe Exp $"); +RCSID("$Id: lex.c,v 1.80 2000/05/11 14:09:45 grubba Exp $"); #include "language.h" #include "array.h" #include "lex.h" @@ -162,7 +162,6 @@ struct keyword instr_names[]= { "return 1", F_RETURN_1,0 }, { "return local", F_RETURN_LOCAL, I_HASARG }, { "return if true", F_RETURN_IF_TRUE, 0 }, -{ "while", F_WHILE,0 }, { "label", F_LABEL,I_HASARG }, { "align", F_ALIGN, I_HASARG }, { "call", F_APPLY, I_HASARG }, diff --git a/src/lexer.h b/src/lexer.h index 89ada88d1d..45cd403c72 100644 --- a/src/lexer.h +++ b/src/lexer.h @@ -1,5 +1,5 @@ /* - * $Id: lexer.h,v 1.16 2000/03/10 20:06:34 hubbe Exp $ + * $Id: lexer.h,v 1.17 2000/05/11 14:09:46 grubba Exp $ * * Lexical analyzer template. * Based on lex.c 1.62 @@ -280,11 +280,11 @@ static int low_yylex(YYSTYPE *yylval) { case 0: lex.pos -= (1<<SHIFT); -#ifdef F_LEX_EOF - return F_LEX_EOF; -#else /* !F_LEX_EOF */ +#ifdef TOK_LEX_EOF + return TOK_LEX_EOF; +#else /* !TOK_LEX_EOF */ return 0; -#endif /* F_LEX_EOF */ +#endif /* TOK_LEX_EOF */ case '\n': lex.current_line++; @@ -395,25 +395,25 @@ static int low_yylex(YYSTYPE *yylval) if(!GOBBLE('\'')) yyerror("Unterminated character constant."); debug_malloc_pass( yylval->n=mkintnode(c) ); - return F_NUMBER; + return TOK_NUMBER; case '"': { struct pike_string *s=readstring(); yylval->n=mkstrnode(s); free_string(s); - return F_STRING; + return TOK_STRING; } case ':': - if(GOBBLE(':')) return F_COLON_COLON; + if(GOBBLE(':')) return TOK_COLON_COLON; return c; case '.': if(GOBBLE('.')) { - if(GOBBLE('.')) return F_DOT_DOT_DOT; - return F_DOT_DOT; + if(GOBBLE('.')) return TOK_DOT_DOT_DOT; + return TOK_DOT_DOT; } return c; @@ -443,7 +443,7 @@ static int low_yylex(YYSTYPE *yylval) dmalloc_touch_svalue(&sval); yylval->n = mksvaluenode(&sval); free_svalue(&sval); - return F_NUMBER; + return TOK_NUMBER; } } @@ -484,79 +484,79 @@ static int low_yylex(YYSTYPE *yylval) free_node(yylval->n); lex.pos=p1; yylval->fnum=(FLOAT_TYPE)f; - return F_FLOAT; + return TOK_FLOAT; }else{ debug_malloc_touch(yylval->n); lex.pos=p2; - return F_NUMBER; + return TOK_NUMBER; } case '-': - if(GOBBLE('=')) return F_SUB_EQ; - if(GOBBLE('>')) return F_ARROW; - if(GOBBLE('-')) return F_DEC; + if(GOBBLE('=')) return TOK_SUB_EQ; + if(GOBBLE('>')) return TOK_ARROW; + if(GOBBLE('-')) return TOK_DEC; return '-'; case '+': - if(GOBBLE('=')) return F_ADD_EQ; - if(GOBBLE('+')) return F_INC; + if(GOBBLE('=')) return TOK_ADD_EQ; + if(GOBBLE('+')) return TOK_INC; return '+'; case '&': - if(GOBBLE('=')) return F_AND_EQ; - if(GOBBLE('&')) return F_LAND; + if(GOBBLE('=')) return TOK_AND_EQ; + if(GOBBLE('&')) return TOK_LAND; return '&'; case '|': - if(GOBBLE('=')) return F_OR_EQ; - if(GOBBLE('|')) return F_LOR; + if(GOBBLE('=')) return TOK_OR_EQ; + if(GOBBLE('|')) return TOK_LOR; return '|'; case '^': - if(GOBBLE('=')) return F_XOR_EQ; + if(GOBBLE('=')) return TOK_XOR_EQ; return '^'; case '*': - if(GOBBLE('=')) return F_MULT_EQ; + if(GOBBLE('=')) return TOK_MULT_EQ; return '*'; case '%': - if(GOBBLE('=')) return F_MOD_EQ; + if(GOBBLE('=')) return TOK_MOD_EQ; return '%'; case '/': - if(GOBBLE('=')) return F_DIV_EQ; + if(GOBBLE('=')) return TOK_DIV_EQ; return '/'; case '=': - if(GOBBLE('=')) return F_EQ; + if(GOBBLE('=')) return TOK_EQ; return '='; case '<': if(GOBBLE('<')) { - if(GOBBLE('=')) return F_LSH_EQ; - return F_LSH; + if(GOBBLE('=')) return TOK_LSH_EQ; + return TOK_LSH; } - if(GOBBLE('=')) return F_LE; + if(GOBBLE('=')) return TOK_LE; return '<'; case '>': - if(GOBBLE(')')) return F_MULTISET_END; - if(GOBBLE('=')) return F_GE; + if(GOBBLE(')')) return TOK_MULTISET_END; + if(GOBBLE('=')) return TOK_GE; if(GOBBLE('>')) { - if(GOBBLE('=')) return F_RSH_EQ; - return F_RSH; + if(GOBBLE('=')) return TOK_RSH_EQ; + return TOK_RSH; } return '>'; case '!': - if(GOBBLE('=')) return F_NE; - return F_NOT; + if(GOBBLE('=')) return TOK_NE; + return TOK_NOT; case '(': - if(GOBBLE('<')) return F_MULTISET_START; + if(GOBBLE('<')) return TOK_MULTISET_START; return '('; case ']': @@ -651,7 +651,7 @@ static int low_yylex(YYSTYPE *yylval) struct pike_string *s=make_shared_string(tmp+offset); yylval->n=mkstrnode(s); free_string(s); - return F_IDENTIFIER; + return TOK_IDENTIFIER; } } @@ -674,116 +674,116 @@ static int low_yylex(YYSTYPE *yylval) INDEX_CHARP(buf, 1, SHIFT))) { case TWO_CHAR('a','r'): - if(ISWORD("array")) return F_ARRAY_ID; + if(ISWORD("array")) return TOK_ARRAY_ID; break; case TWO_CHAR('b','r'): - if(ISWORD("break")) return F_BREAK; + if(ISWORD("break")) return TOK_BREAK; break; case TWO_CHAR('c','a'): - if(ISWORD("case")) return F_CASE; - if(ISWORD("catch")) return F_CATCH; + if(ISWORD("case")) return TOK_CASE; + if(ISWORD("catch")) return TOK_CATCH; break; case TWO_CHAR('c','l'): - if(ISWORD("class")) return F_CLASS; + if(ISWORD("class")) return TOK_CLASS; break; case TWO_CHAR('c','o'): - if(ISWORD("constant")) return F_CONSTANT; - if(ISWORD("continue")) return F_CONTINUE; + if(ISWORD("constant")) return TOK_CONSTANT; + if(ISWORD("continue")) return TOK_CONTINUE; break; case TWO_CHAR('d','e'): - if(ISWORD("default")) return F_DEFAULT; + if(ISWORD("default")) return TOK_DEFAULT; break; case TWO_CHAR('d','o'): - if(ISWORD("do")) return F_DO; + if(ISWORD("do")) return TOK_DO; break; case TWO_CHAR('e','l'): - if(ISWORD("else")) return F_ELSE; + if(ISWORD("else")) return TOK_ELSE; break; case TWO_CHAR('e','x'): - if(ISWORD("extern")) return F_EXTERN; + if(ISWORD("extern")) return TOK_EXTERN; break; case TWO_CHAR('f','i'): - if(ISWORD("final")) return F_FINAL_ID; + if(ISWORD("final")) return TOK_FINAL_ID; break; case TWO_CHAR('f','l'): - if(ISWORD("float")) return F_FLOAT_ID; + if(ISWORD("float")) return TOK_FLOAT_ID; break; case TWO_CHAR('f','o'): - if(ISWORD("for")) return F_FOR; - if(ISWORD("foreach")) return F_FOREACH; + if(ISWORD("for")) return TOK_FOR; + if(ISWORD("foreach")) return TOK_FOREACH; break; case TWO_CHAR('f','u'): - if(ISWORD("function")) return F_FUNCTION_ID; + if(ISWORD("function")) return TOK_FUNCTION_ID; break; case TWO_CHAR('g','a'): - if(ISWORD("gauge")) return F_GAUGE; + if(ISWORD("gauge")) return TOK_GAUGE; break; case TWO_CHAR('i','f'): - if(ISWORD("if")) return F_IF; + if(ISWORD("if")) return TOK_IF; break; case TWO_CHAR('i','m'): - if(ISWORD("import")) return F_IMPORT; + if(ISWORD("import")) return TOK_IMPORT; break; case TWO_CHAR('i','n'): - if(ISWORD("int")) return F_INT_ID; - if(ISWORD("inherit")) return F_INHERIT; - if(ISWORD("inline")) return F_INLINE; + if(ISWORD("int")) return TOK_INT_ID; + if(ISWORD("inherit")) return TOK_INHERIT; + if(ISWORD("inline")) return TOK_INLINE; break; case TWO_CHAR('l','a'): - if(ISWORD("lambda")) return F_LAMBDA; + if(ISWORD("lambda")) return TOK_LAMBDA; break; case TWO_CHAR('l','o'): - if(ISWORD("local")) return F_LOCAL_ID; + if(ISWORD("local")) return TOK_LOCAL_ID; break; case TWO_CHAR('m','a'): - if(ISWORD("mapping")) return F_MAPPING_ID; + if(ISWORD("mapping")) return TOK_MAPPING_ID; break; case TWO_CHAR('m','i'): - if(ISWORD("mixed")) return F_MIXED_ID; + if(ISWORD("mixed")) return TOK_MIXED_ID; break; case TWO_CHAR('m','u'): - if(ISWORD("multiset")) return F_MULTISET_ID; + if(ISWORD("multiset")) return TOK_MULTISET_ID; break; case TWO_CHAR('n','o'): - if(ISWORD("nomask")) return F_NO_MASK; + if(ISWORD("nomask")) return TOK_NO_MASK; break; case TWO_CHAR('o','b'): - if(ISWORD("object")) return F_OBJECT_ID; + if(ISWORD("object")) return TOK_OBJECT_ID; break; case TWO_CHAR('o','p'): - if(ISWORD("optional")) return F_OPTIONAL; + if(ISWORD("optional")) return TOK_OPTIONAL; break; case TWO_CHAR('p','r'): - if(ISWORD("program")) return F_PROGRAM_ID; - if(ISWORD("predef")) return F_PREDEF; - if(ISWORD("private")) return F_PRIVATE; - if(ISWORD("protected")) return F_PROTECTED; + if(ISWORD("program")) return TOK_PROGRAM_ID; + if(ISWORD("predef")) return TOK_PREDEF; + if(ISWORD("private")) return TOK_PRIVATE; + if(ISWORD("protected")) return TOK_PROTECTED; break; break; case TWO_CHAR('p','u'): - if(ISWORD("public")) return F_PUBLIC; + if(ISWORD("public")) return TOK_PUBLIC; break; case TWO_CHAR('r','e'): - if(ISWORD("return")) return F_RETURN; + if(ISWORD("return")) return TOK_RETURN; break; case TWO_CHAR('s','s'): - if(ISWORD("sscanf")) return F_SSCANF; + if(ISWORD("sscanf")) return TOK_SSCANF; break; case TWO_CHAR('s','t'): - if(ISWORD("string")) return F_STRING_ID; - if(ISWORD("static")) return F_STATIC; + if(ISWORD("string")) return TOK_STRING_ID; + if(ISWORD("static")) return TOK_STATIC; break; case TWO_CHAR('s','w'): - if(ISWORD("switch")) return F_SWITCH; + if(ISWORD("switch")) return TOK_SWITCH; break; case TWO_CHAR('t','y'): - if(ISWORD("typeof")) return F_TYPEOF; + if(ISWORD("typeof")) return TOK_TYPEOF; break; case TWO_CHAR('v','o'): - if(ISWORD("void")) return F_VOID_ID; + if(ISWORD("void")) return TOK_VOID_ID; break; case TWO_CHAR('w','h'): - if(ISWORD("while")) return F_WHILE; + if(ISWORD("while")) return TOK_WHILE; break; } } @@ -801,7 +801,7 @@ static int low_yylex(YYSTYPE *yylval) #endif /* SHIFT == 0 */ yylval->n=mkstrnode(tmp); free_string(tmp); - return F_IDENTIFIER; + return TOK_IDENTIFIER; } #if 0 }else if (c == (c & 0x9f)) { diff --git a/src/mapping.c b/src/mapping.c index 25ad748604..749225a316 100644 --- a/src/mapping.c +++ b/src/mapping.c @@ -5,14 +5,13 @@ \*/ /**/ #include "global.h" -RCSID("$Id: mapping.c,v 1.82 2000/05/01 02:10:30 hubbe Exp $"); +RCSID("$Id: mapping.c,v 1.83 2000/05/11 14:09:46 grubba Exp $"); #include "main.h" #include "object.h" #include "mapping.h" #include "svalue.h" #include "array.h" #include "pike_macros.h" -#include "language.h" #include "error.h" #include "pike_memory.h" #include "dynamic_buffer.h" @@ -22,6 +21,7 @@ RCSID("$Id: mapping.c,v 1.82 2000/05/01 02:10:30 hubbe Exp $"); #include "stralloc.h" #include "security.h" #include "block_alloc.h" +#include "opcodes.h" #define AVG_LINK_LENGTH 4 #define MIN_LINK_LENGTH 1 diff --git a/src/opcodes.h b/src/opcodes.h index 66b111084c..c2194f46cc 100644 --- a/src/opcodes.h +++ b/src/opcodes.h @@ -5,11 +5,236 @@ \*/ /* - * $Id: opcodes.h,v 1.5 1998/04/16 01:14:17 hubbe Exp $ + * $Id: opcodes.h,v 1.6 2000/05/11 14:09:46 grubba Exp $ */ #ifndef OPCODES_H #define OPCODES_H +/* Opcodes */ + +/* + * These values are used by the stack machine, and can not be directly + * called from Pike. + */ +#define F_OFFSET 257 +#define F_PREFIX_256 258 +#define F_PREFIX_512 259 +#define F_PREFIX_768 260 +#define F_PREFIX_1024 261 +#define F_PREFIX_CHARX256 262 +#define F_PREFIX_WORDX256 263 +#define F_PREFIX_24BITX256 264 +#define F_PREFIX2_256 265 +#define F_PREFIX2_512 266 +#define F_PREFIX2_768 267 +#define F_PREFIX2_1024 268 +#define F_PREFIX2_CHARX256 269 +#define F_PREFIX2_WORDX256 270 +#define F_PREFIX2_24BITX256 271 +#define F_POP_VALUE 272 +#define F_POP_N_ELEMS 273 +#define F_MARK 274 +#define F_MARK2 275 +#define F_MARK_X 276 +#define F_POP_MARK 277 +#define F_CALL_LFUN 278 +#define F_CALL_LFUN_AND_POP 279 +#define F_CALL_LFUN_AND_RETURN 280 +#define F_APPLY 281 +#define F_APPLY_AND_POP 282 +#define F_MARK_APPLY 283 +#define F_MARK_APPLY_POP 284 +#define F_APPLY_AND_RETURN 285 +#define F_MARK_AND_STRING 286 +#define F_APPLY_ASSIGN_LOCAL 287 +#define F_APPLY_ASSIGN_LOCAL_AND_POP 288 + +#define F_BRANCH 289 +#define F_BRANCH_WHEN_ZERO 290 +#define F_BRANCH_WHEN_NON_ZERO 291 +#define F_BRANCH_AND_POP_WHEN_ZERO 292 +#define F_BRANCH_AND_POP_WHEN_NON_ZERO 293 +#define F_BRANCH_WHEN_LT 294 +#define F_BRANCH_WHEN_GT 295 +#define F_BRANCH_WHEN_LE 296 +#define F_BRANCH_WHEN_GE 297 +#define F_BRANCH_WHEN_EQ 298 +#define F_BRANCH_WHEN_NE 299 +#define F_BRANCH_IF_LOCAL 300 +#define F_BRANCH_IF_NOT_LOCAL 301 +#define F_BRANCH_IF_NOT_LOCAL_ARROW 302 +#define F_INC_LOOP 303 +#define F_DEC_LOOP 304 +#define F_INC_NEQ_LOOP 305 +#define F_DEC_NEQ_LOOP 306 +#define F_RECUR 307 +#define F_TAIL_RECUR 308 +#define F_COND_RECUR 309 + +#define F_LEXICAL_LOCAL 310 +#define F_LEXICAL_LOCAL_LVALUE 311 + +#define F_INDEX 312 +#define F_ARROW 313 +#define F_INDIRECT 314 +#define F_STRING_INDEX 315 +#define F_LOCAL_INDEX 316 +#define F_LOCAL_LOCAL_INDEX 317 +#define F_LOCAL_ARROW 318 +#define F_GLOBAL_LOCAL_INDEX 319 +#define F_POS_INT_INDEX 320 +#define F_NEG_INT_INDEX 321 +#define F_MAGIC_INDEX 322 +#define F_MAGIC_SET_INDEX 323 +#define F_LTOSVAL 324 +#define F_LTOSVAL2 325 +#define F_PUSH_ARRAY 326 +#define F_RANGE 327 +#define F_COPY_VALUE 328 + +/* + * Basic value pushing + */ +#define F_LFUN 329 +#define F_TRAMPOLINE 330 +#define F_GLOBAL 331 +#define F_GLOBAL_LVALUE 332 +#define F_LOCAL 333 +#define F_2_LOCALS 334 +#define F_LOCAL_LVALUE 335 +#define F_MARK_AND_LOCAL 336 +#define F_EXTERNAL 337 +#define F_EXTERNAL_LVALUE 338 +#define F_CLEAR_LOCAL 339 +#define F_CLEAR_2_LOCAL 340 +#define F_CLEAR_4_LOCAL 341 +#define F_CLEAR_STRING_SUBTYPE 342 +#define F_CONSTANT 343 +#define F_FLOAT 344 +#define F_STRING 345 +#define F_ARROW_STRING 346 +#define F_NUMBER 347 +#define F_NEG_NUMBER 348 +#define F_CONST_1 349 +#define F_CONST0 350 +#define F_CONST1 351 +#define F_BIGNUM 352 +#define F_UNDEFINED 353 + +/* + * These are the predefined functions that can be accessed from Pike. + */ +#define F_INC 354 +#define F_DEC 355 +#define F_POST_INC 356 +#define F_POST_DEC 357 +#define F_INC_AND_POP 358 +#define F_DEC_AND_POP 359 +#define F_INC_LOCAL 360 +#define F_INC_LOCAL_AND_POP 361 +#define F_POST_INC_LOCAL 362 +#define F_DEC_LOCAL 363 +#define F_DEC_LOCAL_AND_POP 364 +#define F_POST_DEC_LOCAL 365 +#define F_RETURN 366 +#define F_DUMB_RETURN 367 +#define F_RETURN_0 368 +#define F_RETURN_1 369 +#define F_RETURN_LOCAL 370 +#define F_RETURN_IF_TRUE 371 +#define F_THROW_ZERO 372 + +#define F_ASSIGN 373 +#define F_ASSIGN_AND_POP 374 +#define F_ASSIGN_LOCAL 375 +#define F_ASSIGN_LOCAL_AND_POP 376 +#define F_ASSIGN_GLOBAL 377 +#define F_ASSIGN_GLOBAL_AND_POP 378 +#define F_LOCAL_2_LOCAL 379 +#define F_LOCAL_2_GLOBAL 380 +#define F_GLOBAL_2_LOCAL 381 +#define F_ADD 382 +#define F_SUBTRACT 383 +#define F_ADD_INT 384 +#define F_ADD_NEG_INT 385 +#define F_ADD_TO_AND_POP 386 +#define F_ADD_FLOATS 387 +#define F_ADD_INTS 388 +#define F_MULTIPLY 389 +#define F_DIVIDE 390 +#define F_MOD 391 + +#define F_LT 392 +#define F_GT 393 +#define F_EQ 394 +#define F_GE 395 +#define F_LE 396 +#define F_NE 397 +#define F_NEGATE 398 +#define F_NOT 399 +#define F_COMPL 400 +#define F_AND 401 +#define F_OR 402 +#define F_XOR 403 +#define F_LSH 404 +#define F_RSH 405 +#define F_LAND 406 +#define F_LOR 407 +#define F_EQ_OR 408 +#define F_EQ_AND 409 + +#define F_SWITCH 410 +#define F_SSCANF 411 +#define F_CATCH 412 +#define F_CAST 413 +#define F_SOFT_CAST 414 +#define F_FOREACH 415 + +#define F_SIZEOF 416 +#define F_SIZEOF_LOCAL 417 +#define F_CALL_FUNCTION 418 +#define F_CALL_FUNCTION_AND_RETURN 419 + +/* + * These are token values that needn't have an associated code for the + * compiled file + */ +#define F_MAX_OPCODE 420 + +#define F_ADD_EQ 422 +#define F_AND_EQ 423 +#define F_ARG_LIST 424 +#define F_COMMA_EXPR 425 +#define F_BREAK 427 +#define F_CASE 428 +#define F_CONTINUE 432 +#define F_DEFAULT 433 +#define F_DIV_EQ 434 +#define F_DO 435 +#define F_EFUN_CALL 439 +#define F_FOR 443 +#define F_IDENTIFIER 446 +#define F_LSH_EQ 458 +#define F_LVALUE_LIST 459 +#define F_ARRAY_LVALUE 460 +#define F_MOD_EQ 463 +#define F_MULT_EQ 464 +#define F_OR_EQ 467 +#define F_RSH_EQ 473 +#define F_SUB_EQ 478 +#define F_VAL_LVAL 480 +#define F_XOR_EQ 483 +#define F_NOP 484 + +#define F_ALIGN 486 +#define F_POINTER 487 +#define F_LABEL 488 +#define F_DATA 489 +#define F_START_FUNCTION 490 +#define F_BYTE 491 + +#define F_MAX_INSTR 492 + /* Prototypes begin here */ void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind); void o_index(void); diff --git a/src/peep.c b/src/peep.c index c5ac90692a..e838b201e7 100644 --- a/src/peep.c +++ b/src/peep.c @@ -13,8 +13,9 @@ #include "dmalloc.h" #include "stuff.h" #include "bignum.h" +#include "opcodes.h" -RCSID("$Id: peep.c,v 1.32 2000/05/01 02:11:25 hubbe Exp $"); +RCSID("$Id: peep.c,v 1.33 2000/05/11 14:09:46 grubba Exp $"); struct p_instr_s { diff --git a/src/pike_types.c b/src/pike_types.c index 894558edb4..d1c9b26517 100644 --- a/src/pike_types.c +++ b/src/pike_types.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: pike_types.c,v 1.129 2000/03/26 14:16:11 grubba Exp $"); +RCSID("$Id: pike_types.c,v 1.130 2000/05/11 14:09:46 grubba Exp $"); #include <ctype.h> #include "svalue.h" #include "pike_types.h" @@ -25,6 +25,7 @@ RCSID("$Id: pike_types.c,v 1.129 2000/03/26 14:16:11 grubba Exp $"); #include "pike_memory.h" #include "bignum.h" #include "main.h" +#include "opcodes.h" #define PIKE_TYPE_DEBUG diff --git a/src/program.c b/src/program.c index 53a68da267..b1a1c2cb75 100644 --- a/src/program.c +++ b/src/program.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: program.c,v 1.236 2000/05/07 00:39:17 hubbe Exp $"); +RCSID("$Id: program.c,v 1.237 2000/05/11 14:09:46 grubba Exp $"); #include "program.h" #include "object.h" #include "dynamic_buffer.h" @@ -31,6 +31,7 @@ RCSID("$Id: program.c,v 1.236 2000/05/07 00:39:17 hubbe Exp $"); #include "cyclic.h" #include "security.h" #include "pike_types.h" +#include "opcodes.h" #include <errno.h> #include <fcntl.h> -- GitLab