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"
|
795194 | 2000-04-20 | Fredrik Hübinette (Hubbe) | | RCSID("$Id: lex.c,v 1.77 2000/04/21 00:29:48 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"
#include "error.h"
#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
int last_instruction=0;
#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;
fprintf(stderr,"Opcode usage: (opcode, runned, compiled)\n");
for(e=0;e<F_MAX_OPCODE-F_OFFSET;e++)
{
|
15ecdb | 1998-04-06 | Fredrik Hübinette (Hubbe) | | fprintf(stderr,":: %-30s %8ld %8ld\n",
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | low_get_f_name(e+F_OFFSET,0),
(long)instrs[e].runs,
(long)instrs[e].compiles);
}
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | |
#ifdef INSTR_PROFILING
for(e=0;e<F_MAX_OPCODE-F_OFFSET;e++)
{
int d;
for(d=0;d<256;d++)
if(instrs[e].reruns[d])
fprintf(stderr,"%010ld::%s - %s\n",instrs[e].reruns[d],low_get_f_name(e+F_OFFSET,0),low_get_f_name(d+F_OFFSET,0));
}
#endif
|
06983f | 1996-09-22 | 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[]=
{
|
87c759 | 2000-04-18 | Fredrik Hübinette (Hubbe) | | #include "interpret_protos.h"
|
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 },
|
9b08a2 | 1998-03-31 | Fredrik Hübinette (Hubbe) | | { "pointer", F_POINTER, I_ISPOINTER },
{ "data", F_DATA, I_DATA },
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | |
{ "local function call",F_CALL_LFUN, I_HASARG },
{ "local function call and pop",F_CALL_LFUN_AND_POP, I_HASARG },
|
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) | | { "while", F_WHILE,0 },
{ "label", F_LABEL,I_HASARG },
|
2d1234 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | { "align", F_ALIGN, I_HASARG },
{ "call", F_APPLY, I_HASARG },
{ "int index", F_POS_INT_INDEX, I_HASARG },
{ "-int index", F_NEG_INT_INDEX, I_HASARG },
{ "apply and pop", F_APPLY_AND_POP, I_HASARG },
|
ed19dd | 1998-12-20 | Fredrik Hübinette (Hubbe) | | { "nop", F_NOP,0 },
|
3c04e8 | 1997-03-13 | Fredrik Hübinette (Hubbe) | | { "mark & call", F_MARK_APPLY, I_HASARG },
{ "mark, call & pop", F_MARK_APPLY_POP, I_HASARG },
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | { "apply and return", F_APPLY_AND_RETURN, I_HASARG },
{ "call lfun & return", F_CALL_LFUN_AND_RETURN, I_HASARG },
{ "call function", F_CALL_FUNCTION, 0 },
{ "call function & return", F_CALL_FUNCTION_AND_RETURN, 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;
#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) {
if(fp && fp->context.prog &&
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | (int)fp->context.prog->num_constants > (int)(n-F_MAX_OPCODE) &&
|
454d54 | 1999-09-18 | Fredrik Hübinette (Hubbe) | | fp->context.prog->constants[n-F_MAX_OPCODE].sval.type==T_FUNCTION &&
fp->context.prog->constants[n-F_MAX_OPCODE].sval.subtype == FUNCTION_BUILTIN &&
fp->context.prog->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 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
#include "lexer.h"
#undef SHIFT
#define SHIFT 1
#include "lexer.h"
#undef SHIFT
#define SHIFT 2
#include "lexer.h"
#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) | | }
|