RT,今天是特殊纪念日,赶时间,简单啰嗦几句.
什么是词法分析?
词法分析就是把一门语言中的各个部分区分出来.单独用表示出来.不啰嗦了,上代码.
大概就是这样吧,剩下的看工程吧,example是测试的例子.简单一些示例代码.
源码标签
typedef struct __token
{
char * name;
short id;
}var_token;
extern const var_token ext_ecc_token[MAX_TOKEN];
extern const var_token ext_ecc_pp[MAX_PP_TOKEN];
注释和类型.
/*Abstract description of a linked list*/
typedef struct ecc_ast_alloc
{
/*token word list*/
short type_id;
char* p_value;
short value_len;
struct ecc_ast_alloc * front;
struct ecc_ast_alloc * after;
}ecc_ast;
typedef struct __ecc_comment
{
char * src_comment;
short src_len;
short type;
struct __ecc_comment * front;
struct __ecc_comment * after;
}ecc_comment_list;
导出变量.
extern ecc_comment_list * ext_comment;
extern ecc_ast * ext_ecc_ast;
看下标记的枚举类型.
enum __enum_token_
{
token_auto = 0x500,
token_enum,
token_unsigned,
token_break,
token_extern,
token_return,
token_void,
token_case,
token_float,
token_short,
token_char,
token_for,
token_signed,
token_while,
token_const,
token_goto,
token_sizeof,
token_bool,
token_continue,
token_if,
token_static,
token_default,
token_inline,
token_struct,
token_do,
token_int,
token_switch,
token_double,
token_long,
token_typedef,
token_else,
token_union,
};
enum __enum_pp_token
{
token_pp_define = 0x600,
token_pp_elif,
token_pp_else,
token_pp_endif,
token_pp_if,
token_pp_ifdef,
token_pp_ifndef,
token_pp_include,
token_pp_undef,
};
enum __enum_operate
{
token_space = 0x257, /* ' ' \t */
token_eol, /* \n */
token_cpp_comment, /* C++ comment */
token_c_comment, /* C comment */
token_word, /* Word */
token_number, /* A number */
token_complex_divide,/* /= */
token_divide, /* / */
token_left_shift, /* << */
token_less_equal, /* <= */
token_complex_left_shift, /* <<= */
token_less, /* < */
token_right_shift, /* >> */
token_greater_equal, /* >= */
token_complex_right_shift, /* >>= */
token_greater, /* > */
token_front_subtract,/* -- */
token_ptr_member, /* -> */
token_complex_subtract,/* -= */
token_subtract, /* - */
token_complex_add, /* += */
token_add, /* + */
token_equal, /* == */
token_assignment, /* = */
token_not_equal, /* != */
token_logical_not, /* ! */
token_complex_bitwise_not, /* ~= */
token_bitwise_not, /* ~ */
token_complex_bitwise_inclusive_or, /* |= */
token_logical_or, /* || */
token_bitwise_inclusive_or, /* | */
token_logical_and, /* && */
token_complex_bitwise_and, /* &= */
token_bitwise_and, /* & */
token_complex_bitwise_exclusive_or, /* ^= */
token_bitwise_exclusive_or, /* ^ */
token_complex_remainder, /* %= */
token_remainder, /* % */
token_question, /* ? */
token_semicolon, /* ; */
token_colon, /* : */
token_comma, /* , */
token_point, /* . */
token_lparen, /* ( */
token_rparen, /* ) */
token_larray, /* [ */
token_rarray, /* ] */
token_lbrace, /* { */
token_rbrace, /* } */
token_double_quote, /* " */
token_single_quote, /* ' */
token_backslash /* \ */
};
需要初始化的标记.
const var_token ext_ecc_token[MAX_TOKEN]=
{
{"auto",token_auto},
{"enum",token_enum},
{"unsigned",token_unsigned},
{"break",token_break},
{"extern",token_extern},
{"return",token_return},
{"void",token_void},
{"case",token_case},
{"float",token_float},
{"short",token_short},
{"char",token_char},
{"for",token_for},
{"signed",token_signed},
{"while",token_while},
{"const",token_const},
{"goto",token_goto},
{"sizeof",token_sizeof},
{"bool",token_bool},
{"continue",token_continue},
{"if",token_if},
{"static",token_static},
{"default",token_default},
{"struct",token_struct},
{"do",token_do},
{"int",token_int},
{"switch",token_switch},
{"double",token_double},
{"long",token_long},
{"typedef",token_typedef},
{"else",token_else},
{"union",token_union},
};
const var_token ext_ecc_pp[MAX_PP_TOKEN] =
{
{"#define",token_pp_define},
{"#elif",token_pp_elif},
{"#else",token_pp_else},
{"#endif",token_pp_endif},
{"#if",token_pp_if},
{"#ifdef",token_pp_ifdef},
{"#ifndef",token_pp_ifndef},
{"#include",token_pp_include},
{"#undef",token_pp_undef},
};
void ecc_parse(char * src,size_t len)
{
if(NULL == (ext_ecc_ast = alloc_chunk(sizeof(ecc_ast))))
return;
if(NULL == (ext_comment = alloc_chunk(sizeof(ecc_comment_list))))
return;
g_src = src;
do
{
if(ecc_preprocessor())
continue;
if(ecc_keyword())
continue;
if(ecc_identifier())
continue;
if(ecc_constants())
continue;
if(ecc_comment())
continue;
if(ecc_operator())
continue;
else
++g_src;
}while(*g_src);
}
[课程]FART 脱壳王!加量不加价!FART作者讲授!