cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | |
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
acbf0a | 1999-02-20 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | | RCSID("$Id: lex.c,v 1.90 2001/06/29 18:19:30 hubbe Exp $");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "language.h"
#include "array.h"
#include "lex.h"
#include "stralloc.h"
#include "dynamic_buffer.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "constants.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "hashtable.h"
#include "stuff.h"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "interpret.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "object.h"
#include "las.h"
#include "operators.h"
#include "opcodes.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "builtin_functions.h"
#include "main.h"
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | #include "mapping.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
bdfb86 | 1997-12-22 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_SYS_PARAM_H
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include <sys/param.h>
|
bdfb86 | 1997-12-22 | Fredrik Hübinette (Hubbe) | | #endif
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include <ctype.h>
#include <math.h>
#include <fcntl.h>
#include <errno.h>
|
78ec7a | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #include "time_stuff.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
#define LEXDEBUG 0
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | #ifdef INSTR_PROFILING
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | |
struct instr_counter
{
long runned;
struct instr_counter* next[256];
};
int last_instruction[256];
struct instr_counter *instr_counter_storage;
struct instr_counter *init_instr_storage_pointers(int depth)
{
int e;
struct instr_counter *d;
if(!depth) return 0;
d=ALLOC_STRUCT(instr_counter);
if(!d)
{
fprintf(stderr,"-p%d: out of memory.\n",p_flag);
exit(2);
}
dmalloc_accept_leak(d);
d->runned=0;
for(e=0;e<F_MAX_OPCODE-F_OFFSET;e++)
d->next[e]=init_instr_storage_pointers(depth-1);
return d;
}
void add_runned(int instr)
{
int e;
struct instr_counter **tmp=&instr_counter_storage;
for(e=0;e<p_flag;e++)
{
tmp[0]->runned++;
tmp=tmp[0]->next + last_instruction[e];
last_instruction[e]=last_instruction[e+1];
}
((char **)(tmp))[0]++;
last_instruction[e]=instr;
}
void present_runned(struct instr_counter *d, int depth, int maxdepth)
{
int e;
if(depth == maxdepth)
{
long runned = depth < p_flag ? d->runned : (long)d;
if(!runned) return;
fprintf(stderr,"%010ld @%d@: ",runned,maxdepth);
for(e=0;e<depth;e++)
{
if(e) fprintf(stderr," :: ");
fprintf(stderr,"%s",
low_get_f_name(last_instruction[e] + F_OFFSET,0));
}
fprintf(stderr,"\n");
}else{
for(e=0;e<F_MAX_OPCODE-F_OFFSET;e++)
{
last_instruction[depth]=e;
present_runned(d->next[e],depth+1, maxdepth);
}
}
}
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | #endif
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void exit_lex(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | | if(p_flag)
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | {
int e;
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"Opcode compiles: (opcode, compiled)\n");
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | for(e=0;e<F_MAX_OPCODE-F_OFFSET;e++)
{
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"%08ld;;%-30s\n",
(long)instrs[e].compiles,
low_get_f_name(e+F_OFFSET,0));
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | }
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | |
#ifdef INSTR_PROFILING
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | | for(e=0;e<=p_flag;e++)
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | {
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,"Opcode x %d usage:\n",e);
present_runned(instr_counter_storage, 0, e);
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | }
#endif
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
87c759 | 2000-04-18 | Fredrik Hübinette (Hubbe) | | #define OPCODE0(OP,DESC) { DESC, OP, 0 },
#define OPCODE1(OP,DESC) { DESC, OP, I_HASARG },
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | #define OPCODE2(OP,DESC) { DESC, OP, I_TWO_ARGS },
|
87c759 | 2000-04-18 | Fredrik Hübinette (Hubbe) | |
#define OPCODE0_TAIL(OP,DESC) { DESC, OP, 0 },
#define OPCODE1_TAIL(OP,DESC) { DESC, OP, I_HASARG },
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | #define OPCODE2_TAIL(OP,DESC) { DESC, OP, I_TWO_ARGS },
|
87c759 | 2000-04-18 | Fredrik Hübinette (Hubbe) | |
|
795194 | 2000-04-20 | Fredrik Hübinette (Hubbe) | | #define OPCODE0_JUMP(OP,DESC) { DESC, OP, I_ISJUMP },
#define OPCODE1_JUMP(OP,DESC) { DESC, OP, I_HASARG },
#define OPCODE2_JUMP(OP,DESC) { DESC, OP, I_TWO_ARGS },
#define OPCODE0_TAILJUMP(OP,DESC) { DESC, OP, I_ISJUMP },
#define OPCODE1_TAILJUMP(OP,DESC) { DESC, OP, I_HASARG },
#define OPCODE2_TAILJUMP(OP,DESC) { DESC, OP, I_TWO_ARGS },
|
87c759 | 2000-04-18 | Fredrik Hübinette (Hubbe) | | #define LEXER
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct keyword instr_names[]=
{
|
dbecc3 | 2000-10-30 | Henrik Grubbström (Grubba) | | #ifndef PIKE_PRECOMPILER
|
87c759 | 2000-04-18 | Fredrik Hübinette (Hubbe) | | #include "interpret_protos.h"
|
dbecc3 | 2000-10-30 | Henrik Grubbström (Grubba) | | #endif /* !PIKE_PRECOMPILER */
|
ed19dd | 1998-12-20 | Fredrik Hübinette (Hubbe) | | { "!=", F_NE,0 },
{ "%=", F_MOD_EQ,0 },
{ "&=", F_AND_EQ,0 },
|
f853ac | 2000-04-20 | Henrik Grubbström (Grubba) | | { "|=", F_OR_EQ,0 },
|
ed19dd | 1998-12-20 | Fredrik Hübinette (Hubbe) | | { "*=", F_MULT_EQ,0 },
{ "+=", F_ADD_EQ,0 },
{ "-=", F_SUB_EQ,0 },
{ "/=", F_DIV_EQ,0 },
{ "<", F_LT,0 },
{ "<<=", F_LSH_EQ,0 },
{ "<=", F_LE,0 },
{ "==", F_EQ,0 },
{ ">", F_GT,0 },
{ ">=", F_GE,0 },
{ ">>=", F_RSH_EQ,0 },
{ "^=", F_XOR_EQ,0 },
{ "arg+=1024", F_PREFIX_1024,0 },
{ "arg+=256", F_PREFIX_256,0 },
{ "arg+=256*X", F_PREFIX_CHARX256,0 },
{ "arg+=256*XX", F_PREFIX_WORDX256,0 },
{ "arg+=256*XXX", F_PREFIX_24BITX256,0 },
{ "arg+=512", F_PREFIX_512,0 },
{ "arg+=768", F_PREFIX_768,0 },
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | |
{ "arg+=1024", F_PREFIX2_1024,0 },
{ "arg+=256", F_PREFIX2_256,0 },
{ "arg+=256*X", F_PREFIX2_CHARX256,0 },
{ "arg+=256*XX", F_PREFIX2_WORDX256,0 },
{ "arg+=256*XXX", F_PREFIX2_24BITX256,0 },
{ "arg+=512", F_PREFIX2_512,0 },
{ "arg+=768", F_PREFIX2_768,0 },
|
ed19dd | 1998-12-20 | Fredrik Hübinette (Hubbe) | | { "break", F_BREAK,0 },
{ "case", F_CASE,0 },
{ "continue", F_CONTINUE,0 },
{ "default", F_DEFAULT,0 },
{ "do-while", F_DO,0 },
{ "dumb return", F_DUMB_RETURN,0 },
{ "for", F_FOR,0 },
{ "index", F_INDEX,0 },
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | |
|
a7538d | 1998-05-12 | Fredrik Hübinette (Hubbe) | | { "branch if !local", F_BRANCH_IF_NOT_LOCAL, I_HASARG },
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | { "branch if <", F_BRANCH_WHEN_LT, I_ISJUMP },
{ "branch if >", F_BRANCH_WHEN_GT, I_ISJUMP },
{ "branch if <=", F_BRANCH_WHEN_LE, I_ISJUMP },
{ "branch if >=", F_BRANCH_WHEN_GE, I_ISJUMP },
{ "branch if ==", F_BRANCH_WHEN_EQ, I_ISJUMP },
{ "branch if !=", F_BRANCH_WHEN_NE, I_ISJUMP },
|
596e36 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | { "branch & pop if zero", F_BRANCH_AND_POP_WHEN_ZERO, I_ISJUMP },
{ "branch & pop if !zero", F_BRANCH_AND_POP_WHEN_NON_ZERO, I_ISJUMP },
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | { "++Loop", F_INC_LOOP, I_ISJUMP },
{ "++Loop!=", F_INC_NEQ_LOOP, I_ISJUMP },
{ "--Loop", F_DEC_LOOP, I_ISJUMP },
{ "--Loop!=", F_DEC_NEQ_LOOP, I_ISJUMP },
{ "&&", F_LAND, I_ISJUMP },
{ "||", F_LOR, I_ISJUMP },
{ "==||", F_EQ_OR, I_ISJUMP },
{ "==&&", F_EQ_AND, I_ISJUMP },
{ "catch", F_CATCH, I_ISJUMP },
{ "foreach", F_FOREACH, I_ISJUMP },
|
4cdb80 | 2001-02-23 | Fredrik Hübinette (Hubbe) | | { "foreach++", F_NEW_FOREACH, I_ISJUMP },
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | { "pointer", F_POINTER, I_ISPOINTER },
{ "data", F_DATA, I_DATA },
|
873ceb | 2000-04-30 | Fredrik Hübinette (Hubbe) | | { "byte", F_BYTE, I_DATA },
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | |
|
36c456 | 2000-04-18 | Henrik Grubbström (Grubba) | | { "lvalue_list", F_LVALUE_LIST,0 },
|
ed19dd | 1998-12-20 | Fredrik Hübinette (Hubbe) | | { "return", F_RETURN,0 },
{ "return 0", F_RETURN_0,0 },
{ "return 1", F_RETURN_1,0 },
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | { "return local", F_RETURN_LOCAL, I_HASARG },
|
0f1943 | 1999-11-29 | Fredrik Hübinette (Hubbe) | | { "return if true", F_RETURN_IF_TRUE, 0 },
|
ed19dd | 1998-12-20 | Fredrik Hübinette (Hubbe) | | { "label", F_LABEL,I_HASARG },
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | { "align", F_ALIGN, I_HASARG },
{ "int index", F_POS_INT_INDEX, I_HASARG },
{ "-int index", F_NEG_INT_INDEX, I_HASARG },
|
ed19dd | 1998-12-20 | Fredrik Hübinette (Hubbe) | | { "nop", F_NOP,0 },
|
873ceb | 2000-04-30 | Fredrik Hübinette (Hubbe) | | { "function start", F_START_FUNCTION,0 },
|
fa8c69 | 2000-11-30 | Fredrik Hübinette (Hubbe) | | { "notreached!", F_NOTREACHED, 0 },
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | };
struct instr instrs[F_MAX_INSTR - F_OFFSET];
struct reserved
{
struct hash_entry link;
int token;
};
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | void init_lex()
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
unsigned int i;
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
int fatal_later=0;
|
fe8073 | 2001-06-29 | Fredrik Hübinette (Hubbe) | | #ifdef INSTR_PROFILING
instr_counter_storage=init_instr_storage_pointers(p_flag);
#endif
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(i=0; i<NELEM(instr_names);i++)
{
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(instr_names[i].token >= F_MAX_INSTR)
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | {
fprintf(stderr,"Error in instr_names[%u]\n\n",i);
fatal_later++;
}
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | |
if(instrs[instr_names[i].token - F_OFFSET].name)
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | | {
fprintf(stderr,"Duplicate name for %s\n",instr_names[i].word);
fatal_later++;
}
#endif
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | instrs[instr_names[i].token - F_OFFSET].name = instr_names[i].word;
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | instrs[instr_names[i].token - F_OFFSET].flags=instr_names[i].flags;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
a96ce9 | 2000-04-19 | Fredrik Hübinette (Hubbe) | |
#ifdef PIKE_DEBUG
for(i=1; i<F_MAX_OPCODE-F_OFFSET;i++)
{
if(!instrs[i].name)
{
fprintf(stderr,"Opcode %d does not have a name.\n",i);
fatal_later++;
}
}
if(fatal_later)
fatal("Found %d errors in instrs.\n",fatal_later);
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
char *low_get_f_name(int n,struct program *p)
{
static char buf[30];
if (n<F_MAX_OPCODE && instrs[n-F_OFFSET].name)
{
return instrs[n-F_OFFSET].name;
}else if(n >= F_MAX_OPCODE) {
if(p &&
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | (int)p->num_constants > (int)(n-F_MAX_OPCODE) &&
|
454d54 | 1999-09-18 | Fredrik Hübinette (Hubbe) | | p->constants[n-F_MAX_OPCODE].sval.type==T_FUNCTION &&
(p->constants[n-F_MAX_OPCODE].sval.subtype == FUNCTION_BUILTIN) &&
p->constants[n-F_MAX_OPCODE].sval.u.efun)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
454d54 | 1999-09-18 | Fredrik Hübinette (Hubbe) | | return p->constants[n-F_MAX_OPCODE].sval.u.efun->name->str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
sprintf(buf, "Call efun %d", n - F_MAX_OPCODE);
return buf;
}
}else{
sprintf(buf, "<OTHER %d>", n);
return buf;
}
}
char *get_f_name(int n)
{
static char buf[30];
if (n<F_MAX_OPCODE && instrs[n-F_OFFSET].name)
{
return instrs[n-F_OFFSET].name;
}else if(n >= F_MAX_OPCODE) {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_fp && Pike_fp->context.prog &&
(int)Pike_fp->context.prog->num_constants > (int)(n-F_MAX_OPCODE) &&
Pike_fp->context.prog->constants[n-F_MAX_OPCODE].sval.type==T_FUNCTION &&
Pike_fp->context.prog->constants[n-F_MAX_OPCODE].sval.subtype == FUNCTION_BUILTIN &&
Pike_fp->context.prog->constants[n-F_MAX_OPCODE].sval.u.efun)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | return Pike_fp->context.prog->constants[n-F_MAX_OPCODE].sval.u.efun->name->str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
sprintf(buf, "Call efun %d", n - F_MAX_OPCODE);
return buf;
}
}else{
sprintf(buf, "<OTHER %d>", n);
return buf;
}
}
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | char *get_token_name(int n)
{
static char buf[30];
if (n<F_MAX_INSTR && instrs[n-F_OFFSET].name)
{
return instrs[n-F_OFFSET].name;
}else{
sprintf(buf, "<OTHER %d>", n);
return buf;
}
}
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct lex lex;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
acbf0a | 1999-02-20 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
acbf0a | 1999-02-20 | Henrik Grubbström (Grubba) | | #define SHIFT 0
|
fe104b | 2000-11-25 | Henrik Grubbström (Grubba) | | #include "lexer0.h"
|
acbf0a | 1999-02-20 | Henrik Grubbström (Grubba) | | #undef SHIFT
#define SHIFT 1
|
fe104b | 2000-11-25 | Henrik Grubbström (Grubba) | | #include "lexer1.h"
|
acbf0a | 1999-02-20 | Henrik Grubbström (Grubba) | | #undef SHIFT
#define SHIFT 2
|
fe104b | 2000-11-25 | Henrik Grubbström (Grubba) | | #include "lexer2.h"
|
acbf0a | 1999-02-20 | Henrik Grubbström (Grubba) | | #undef SHIFT
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | int yylex(YYSTYPE *yylval)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
acbf0a | 1999-02-20 | Henrik Grubbström (Grubba) | | #if LEXDEBUG>8
fprintf(stderr, "YYLEX: Calling lexer at 0x%08lx\n",
(long)lex.current_lexer);
#endif /* LEXDEBUG > 8 */
return(lex.current_lexer(yylval));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|