📄 sltoken.c
字号:
/* Copyright (c) 1998, 1999, 2001, 2002, 2003 John E. Davis * This file is part of the S-Lang library. * * You may distribute under the terms of either the GNU General Public * License or the Perl Artistic License. */#include "slinclud.h"#include "slang.h"#include "_slang.h"#define MAX_TOKEN_LEN 254#define MAX_FILE_LINE_LEN 256static char Empty_Line[1] = {0};static int Default_Compile_Line_Num_Info;static char *Input_Line = Empty_Line;static char *Input_Line_Pointer;static SLPreprocess_Type *This_SLpp;static SLang_Load_Type *LLT;static char *map_token_to_string (_SLang_Token_Type *tok){ char *s; static char numbuf [32]; unsigned char type; s = NULL; if (tok != NULL) type = tok->type; else type = 0; switch (type) { case 0: s = "??"; break; case CHAR_TOKEN: case SHORT_TOKEN: case INT_TOKEN: case LONG_TOKEN: s = numbuf; sprintf (s, "%ld", tok->v.long_val); break; case UCHAR_TOKEN: case USHORT_TOKEN: case UINT_TOKEN: case ULONG_TOKEN: s = numbuf; sprintf (s, "%lu", (unsigned long)tok->v.long_val); break; case OBRACKET_TOKEN: s = "["; break; case CBRACKET_TOKEN: s = "]"; break; case OPAREN_TOKEN: s = "("; break; case CPAREN_TOKEN: s = ")"; break; case OBRACE_TOKEN: s = "{"; break; case CBRACE_TOKEN: s = "}"; break; case DEREF_TOKEN: s = "@"; break; case POUND_TOKEN: s = "#"; break; case COMMA_TOKEN: s = ","; break; case SEMICOLON_TOKEN: s = ";"; break; case COLON_TOKEN: s = ":"; break;#if SLANG_HAS_FLOAT case FLOAT_TOKEN: case DOUBLE_TOKEN: case COMPLEX_TOKEN:#endif case IDENT_TOKEN: if ((tok->free_sval_flag == 0) || (tok->num_refs == 0)) break; /* drop */ default: s = tok->v.s_val; break; } if (s == NULL) { s = numbuf; sprintf (s, "(0x%02X)", type); } return s;}static char *make_line_file_error (char *buf, unsigned int buflen, _SLang_Token_Type *tok, char *dsc, int line, char *file){#if _SLANG_HAS_DEBUG_CODE if (tok != NULL) line = tok->line_number;#endif if (file == NULL) file = "??"; (void) _SLsnprintf (buf, buflen, "%s: found '%s', line %d, file: %s", dsc, map_token_to_string (tok), line, file); return buf;}void _SLparse_error(char *str, _SLang_Token_Type *tok, int flag){ char buf [1024]; if (str == NULL) str = "Parse Error"; make_line_file_error (buf, sizeof (buf), tok, str, LLT->line_num, (char *) LLT->name); if ((flag == 0) && SLang_Error) return; SLang_verror (SL_SYNTAX_ERROR, "%s", buf);}static void do_line_file_error (int line, char *file){ SLang_verror (SL_SYNTAX_ERROR, "called from line %d, file: %s", line, file);}#define ALPHA_CHAR 1#define DIGIT_CHAR 2#define EXCL_CHAR 3#define SEP_CHAR 4#define OP_CHAR 5#define DOT_CHAR 6#define BOLDOT_CHAR 7#define DQUOTE_CHAR 8#define QUOTE_CHAR 9#define COMMENT_CHAR 10#define NL_CHAR 11#define BAD_CHAR 12#define WHITE_CHAR 13#define CHAR_EOF 255#define CHAR_CLASS(c) (Char_Type_Table[(c)][0])#define CHAR_DATA(c) (Char_Type_Table[(c)][1])/* In this table, if a single character can represent an operator, e.g., * '&' (BAND_TOKEN), then it must be placed before multiple-character * operators that begin with the same character, e.g., "&=". See * get_op_token to see how this is exploited. * * The third character null terminates the operator string. This is for * the token structure. */static SLCONST char Operators [29][4] ={#define OFS_EXCL 0 {'!', '=', 0, NE_TOKEN},#define OFS_POUND 1 {'#', 0, 0, POUND_TOKEN},#define OFS_BAND 2 {'&', 0, 0, BAND_TOKEN}, {'&', '&', 0, EOF_TOKEN}, {'&', '=', 0, BANDEQS_TOKEN},#define OFS_STAR 5 {'*', 0, 0, TIMES_TOKEN}, {'*', '=', 0, TIMESEQS_TOKEN},#define OFS_PLUS 7 {'+', 0, 0, ADD_TOKEN}, {'+', '+', 0, PLUSPLUS_TOKEN}, {'+', '=', 0, PLUSEQS_TOKEN},#define OFS_MINUS 10 {'-', 0, 0, SUB_TOKEN}, {'-', '-', 0, MINUSMINUS_TOKEN}, {'-', '=', 0, MINUSEQS_TOKEN}, {'-', '>', 0, NAMESPACE_TOKEN},#define OFS_DIV 14 {'/', 0, 0, DIV_TOKEN}, {'/', '=', 0, DIVEQS_TOKEN},#define OFS_LT 16 {'<', 0, 0, LT_TOKEN}, {'<', '=', 0, LE_TOKEN},#define OFS_EQS 18 {'=', 0, 0, ASSIGN_TOKEN}, {'=', '=', 0, EQ_TOKEN},#define OFS_GT 20 {'>', 0, 0, GT_TOKEN}, {'>', '=', 0, GE_TOKEN},#define OFS_AT 22 {'@', 0, 0, DEREF_TOKEN},#define OFS_POW 23 {'^', 0, 0, POW_TOKEN},#define OFS_BOR 24 {'|', 0, 0, BOR_TOKEN}, {'|', '|', 0, EOF_TOKEN}, {'|', '=', 0, BOREQS_TOKEN},#define OFS_BNOT 27 {'~', 0, 0, BNOT_TOKEN}, { 0, 0, 0, EOF_TOKEN}};static SLCONST unsigned char Char_Type_Table[256][2] ={ { NL_CHAR, 0 }, /* 0x0 */ { BAD_CHAR, 0 }, /* 0x1 */ { BAD_CHAR, 0 }, /* 0x2 */ { BAD_CHAR, 0 }, /* 0x3 */ { BAD_CHAR, 0 }, /* 0x4 */ { BAD_CHAR, 0 }, /* 0x5 */ { BAD_CHAR, 0 }, /* 0x6 */ { BAD_CHAR, 0 }, /* 0x7 */ { WHITE_CHAR, 0 }, /* 0x8 */ { WHITE_CHAR, 0 }, /* 0x9 */ { NL_CHAR, 0 }, /* \n */ { WHITE_CHAR, 0 }, /* 0xb */ { WHITE_CHAR, 0 }, /* 0xc */ { WHITE_CHAR, 0 }, /* \r */ { BAD_CHAR, 0 }, /* 0xe */ { BAD_CHAR, 0 }, /* 0xf */ { BAD_CHAR, 0 }, /* 0x10 */ { BAD_CHAR, 0 }, /* 0x11 */ { BAD_CHAR, 0 }, /* 0x12 */ { BAD_CHAR, 0 }, /* 0x13 */ { BAD_CHAR, 0 }, /* 0x14 */ { BAD_CHAR, 0 }, /* 0x15 */ { BAD_CHAR, 0 }, /* 0x16 */ { BAD_CHAR, 0 }, /* 0x17 */ { BAD_CHAR, 0 }, /* 0x18 */ { BAD_CHAR, 0 }, /* 0x19 */ { BAD_CHAR, 0 }, /* 0x1a */ { BAD_CHAR, 0 }, /* 0x1b */ { BAD_CHAR, 0 }, /* 0x1c */ { BAD_CHAR, 0 }, /* 0x1d */ { BAD_CHAR, 0 }, /* 0x1e */ { BAD_CHAR, 0 }, /* 0x1f */ { WHITE_CHAR, 0 }, /* 0x20 */ { EXCL_CHAR, OFS_EXCL }, /* ! */ { DQUOTE_CHAR, 0 }, /* " */ { OP_CHAR, OFS_POUND }, /* # */ { ALPHA_CHAR, 0 }, /* $ */ { NL_CHAR, 0 },/* % */ { OP_CHAR, OFS_BAND }, /* & */ { QUOTE_CHAR, 0 }, /* ' */ { SEP_CHAR, OPAREN_TOKEN }, /* ( */ { SEP_CHAR, CPAREN_TOKEN }, /* ) */ { OP_CHAR, OFS_STAR }, /* * */ { OP_CHAR, OFS_PLUS}, /* + */ { SEP_CHAR, COMMA_TOKEN }, /* , */ { OP_CHAR, OFS_MINUS }, /* - */ { DOT_CHAR, 0 }, /* . */ { OP_CHAR, OFS_DIV }, /* / */ { DIGIT_CHAR, 0 }, /* 0 */ { DIGIT_CHAR, 0 }, /* 1 */ { DIGIT_CHAR, 0 }, /* 2 */ { DIGIT_CHAR, 0 }, /* 3 */ { DIGIT_CHAR, 0 }, /* 4 */ { DIGIT_CHAR, 0 }, /* 5 */ { DIGIT_CHAR, 0 }, /* 6 */ { DIGIT_CHAR, 0 }, /* 7 */ { DIGIT_CHAR, 0 }, /* 8 */ { DIGIT_CHAR, 0 }, /* 9 */ { SEP_CHAR, COLON_TOKEN }, /* : */ { SEP_CHAR, SEMICOLON_TOKEN }, /* ; */ { OP_CHAR, OFS_LT }, /* < */ { OP_CHAR, OFS_EQS }, /* = */ { OP_CHAR, OFS_GT }, /* > */ { BAD_CHAR, 0 }, /* ? */ { OP_CHAR, OFS_AT}, /* @ */ { ALPHA_CHAR, 0 }, /* A */ { ALPHA_CHAR, 0 }, /* B */ { ALPHA_CHAR, 0 }, /* C */ { ALPHA_CHAR, 0 }, /* D */ { ALPHA_CHAR, 0 }, /* E */ { ALPHA_CHAR, 0 }, /* F */ { ALPHA_CHAR, 0 }, /* G */ { ALPHA_CHAR, 0 }, /* H */ { ALPHA_CHAR, 0 }, /* I */ { ALPHA_CHAR, 0 }, /* J */ { ALPHA_CHAR, 0 }, /* K */ { ALPHA_CHAR, 0 }, /* L */ { ALPHA_CHAR, 0 }, /* M */ { ALPHA_CHAR, 0 }, /* N */ { ALPHA_CHAR, 0 }, /* O */ { ALPHA_CHAR, 0 }, /* P */ { ALPHA_CHAR, 0 }, /* Q */ { ALPHA_CHAR, 0 }, /* R */ { ALPHA_CHAR, 0 }, /* S */ { ALPHA_CHAR, 0 }, /* T */ { ALPHA_CHAR, 0 }, /* U */ { ALPHA_CHAR, 0 }, /* V */ { ALPHA_CHAR, 0 }, /* W */ { ALPHA_CHAR, 0 }, /* X */ { ALPHA_CHAR, 0 }, /* Y */ { ALPHA_CHAR, 0 }, /* Z */ { SEP_CHAR, OBRACKET_TOKEN }, /* [ */ { BAD_CHAR, 0 }, /* \ */ { SEP_CHAR, CBRACKET_TOKEN }, /* ] */ { OP_CHAR, OFS_POW }, /* ^ */ { ALPHA_CHAR, 0 }, /* _ */ { BAD_CHAR, 0 }, /* ` */ { ALPHA_CHAR, 0 }, /* a */ { ALPHA_CHAR, 0 }, /* b */ { ALPHA_CHAR, 0 }, /* c */ { ALPHA_CHAR, 0 }, /* d */ { ALPHA_CHAR, 0 }, /* e */ { ALPHA_CHAR, 0 }, /* f */ { ALPHA_CHAR, 0 }, /* g */ { ALPHA_CHAR, 0 }, /* h */ { ALPHA_CHAR, 0 }, /* i */ { ALPHA_CHAR, 0 }, /* j */ { ALPHA_CHAR, 0 }, /* k */ { ALPHA_CHAR, 0 }, /* l */ { ALPHA_CHAR, 0 }, /* m */ { ALPHA_CHAR, 0 }, /* n */ { ALPHA_CHAR, 0 }, /* o */ { ALPHA_CHAR, 0 }, /* p */ { ALPHA_CHAR, 0 }, /* q */ { ALPHA_CHAR, 0 }, /* r */ { ALPHA_CHAR, 0 }, /* s */ { ALPHA_CHAR, 0 }, /* t */ { ALPHA_CHAR, 0 }, /* u */ { ALPHA_CHAR, 0 }, /* v */ { ALPHA_CHAR, 0 }, /* w */ { ALPHA_CHAR, 0 }, /* x */ { ALPHA_CHAR, 0 }, /* y */ { ALPHA_CHAR, 0 }, /* z */ { SEP_CHAR, OBRACE_TOKEN }, /* { */ { OP_CHAR, OFS_BOR }, /* | */ { SEP_CHAR, CBRACE_TOKEN }, /* } */ { OP_CHAR, OFS_BNOT }, /* ~ */ { BAD_CHAR, 0 }, /* 0x7f */ { ALPHA_CHAR, 0 }, /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -