From dcecd8026ff461fb5d94c4e997d37858196b8acc Mon Sep 17 00:00:00 2001 From: skeletone Date: Mon, 19 Jun 2023 10:43:49 +0800 Subject: [PATCH] token read in diff state --- build/dest/dest-libgeneral/c-src-file.list | 4 +- doc/design-doc/token-note.txt | 1 + src/config/lxrgmr-code/AQStack.c | 58 +++- src/config/lxrgmr-code/append_str.sh | 7 - src/config/lxrgmr-code/lxrgmr | Bin 81012 -> 0 bytes src/config/lxrgmr-code/token/code.c | 16 +- .../tokenname - \345\211\257\346\234\254.var" | 358 --------------------- src/config/lxrgmr-code/token/tokenname.var.bak | 358 --------------------- src/config/lxrgmr-code/token_id.c | 61 ++-- src/config/lxrgmr-code/token_id.h | 6 +- 10 files changed, 99 insertions(+), 770 deletions(-) create mode 100644 doc/design-doc/token-note.txt delete mode 100644 src/config/lxrgmr-code/append_str.sh delete mode 100644 src/config/lxrgmr-code/lxrgmr delete mode 100644 "src/config/lxrgmr-code/token/tokenname - \345\211\257\346\234\254.var" delete mode 100644 src/config/lxrgmr-code/token/tokenname.var.bak diff --git a/build/dest/dest-libgeneral/c-src-file.list b/build/dest/dest-libgeneral/c-src-file.list index 8ed3a78..890525b 100644 --- a/build/dest/dest-libgeneral/c-src-file.list +++ b/build/dest/dest-libgeneral/c-src-file.list @@ -5,9 +5,9 @@ C_SRC_LIST+="src/config/lxrgmr/QStack.c" C_SRC_LIST+="src/config/lxrgmr/util.c" C_SRC_LIST+="src/config/lxrgmr/confdata.c" -C_SRC_LIST+="src/config/lxrgmr/lxr/lex.lex.c" +#C_SRC_LIST+="src/config/lxrgmr/lxr/lex.lex.c" #C_SRC_LIST+="src/config/lxrgmr/lxr/lexer.lex.c" -#C_SRC_LIST+="src/config/lxrgmr/lxr/script.lex.c" +C_SRC_LIST+="src/config/lxrgmr/lxr/script.lex.c" C_SRC_LIST+="src/config/lxrgmr/gmr/parser.tab.c" C_SRC_LIST+="src/config/lxrgmr/preprocess.c" diff --git a/doc/design-doc/token-note.txt b/doc/design-doc/token-note.txt new file mode 100644 index 0000000..9103c21 --- /dev/null +++ b/doc/design-doc/token-note.txt @@ -0,0 +1 @@ + @ test-ex @ $ @ strbuff @ codeblock state # $(),<(),>(),() # func () {} @ token combine @ envar # token-queue/gmr # syntax # expanssion @ string(``,env,$()) @ expr: expr-assign & env-assign & cmd # cmd & expr-assign,= token proc,set in expr-state # statement-token + (,set in expr-state # [],set expr-state @ @ dollar @ macro # const-lxr # macro(if/define/include/pragma) # this doc(proc in <<) @ cmd & var-def,type/innerfunc/loadable/cmd @ @ stridx,symbtbl @ macro-expanssion switch @ '' "" string auto translation switch(macro&cmd) @ assign & expr # 在code-state中,对于两个token之间包含blank的token缓存到队列。 # 当有=或+=时,设置env-assign-flag, # -=,*=,/=等,设置expr-assign-flag # =()或+=()时,进行()的字符串匹配,保存()中的字符串,在gmr中,如果env-assign为expr-assign,不进行env-assign,进行expr-assign。如果为expr-assign,将env-assign解析为expr-assign。 # 当一个token与上一个token之间包含blank时,判断是否有env-assign-flag,带flag时,合并为ENVASSIGN # 当包含env/expr-assign-flag时,切换到expr状态 # 在expr状态下,连续两个T_WORD时,或;时,返回到上一状态,并返回一个T_STOP_EXPR的 TOKEN,用于从expr的gmr中返回,并忽略该token。 # @ token queue,combine & filter & state # T_WORD & string & const combine # first-token,end-token, # cmnt: cmnt-hdr,cmnt # macro: macro-token,nl # envar: $,} # 两个T_WORD时,first token是否为type,非type为cmd,type为vardef/funcdef ?# expr1: =,; ?# expr2: env-assign(:=,?=),; # expr3: (,) # two T_WORD return from expr to upper state,except in () flag。this can compatiable with cmdline。 @ func-codeblock # {} after () cmd ( cmd param ) { cmd param; } # func + param define between () and {} + func name and param ( in different line + @ () # sub-script,() or $() or <() or >(), in codeblock-state # param-def & ivk-param in expr-state # expr in expr-state # type cast in expr-state @ # cort # init,只在初始化运行单次 @ dollar,cmnt,string,codeblock。test-ex # cmnt + #,//,single line comment,or macro statement # comment example #define aaa 111 // comment example. //comment example. cmd param // comment cmd param #define aaa 111 + /* */,/** **/,multi line cmnt /* * \func: testfunc */ /** comment. **/ cmd param /** comment. **/ # cmnt-state: /**/ + \,@,::,: /* * @func: testfunc * \note:: describe string. * describe string in second line. */ # $: + #,*,@,?,$,!, + $"",$'',$``, + $(),codeblock-state + $(()),$[],expr-state + envar-state: ${}, ${var} ${var[0]} ${#var} ${#var[0]} ${!var} ${!var[0]} ${var:0:1} ${var[0]:0:1} ${var:-value} ${var:=value} ${var:?value} ${var:+value} ${var:-value} ${var:=value} ${var:?value} ${var:+value} ${var:+"str"} ${var:+'str'} ${var:+`cmd param`} ${var[0]:0:1} ${var[0]:0:1//test/#-/@()=_[]+:} ${var[0]:0:1/=_[/]} ${var[0]:0:1#*aaa} ${var[0]:0:1##*aaa} ${var[0]:0:1%*aaa} ${var[0]:0:1%%*aaa} ${var[0]:0:1^^} ${var[0]:0:1,,} # string + '',``,$'',$``,readuntil string 'test string \' `cmd param <>&-` $'test\n' + string-state: "",$"", "abc${xxx}aaa" "abc`echo x`xxx" "abc$(echo x)xxx" "abc`echo "str"x`xxx" "abc$(echo "str"x)xxx" # codeblock-state: + $(), $(echo xxx"$aaa") + <(), cat <(echo xxx"$aaa") + >(), exho xxx | tee >(cat -) + {}, foo () { } foo2 () { } # expr-state: $(()),$[],() + +-*/%,=,|&~^,!,&&,||,<<,>>,++,--,,,.,->,=>,::,(),{},[],$,"",'',``, @ state(tbl,proc-func,test-ex) # cmdcode(c & sh token) # *dollar(pfx-char) # envar(!,#,[],:,-,+,=,?,:-,:?,:=,:+,/,//,#,##,%,%%,^^,,,,"",'',``,[])(pfx,name-str,array-idx,opr,opr-content) # string($,``,) # codeblock("",'',``,$,(),{})macro # expr # cmnt(\,@,::,:) @ # token-tbl # state & state-stack # flag # caching-buff # queue # @ lang-elem & token # comment # macro # cmd(env-assign token) # expr-assign(var-init) # codeblock/subscript # statement(statement,) # declaration # const(string) # func-def # var-def # type-def # invoke # @ lxrgmr # envar,by code # const,lxr # expr,lxr/gmr # main-gmr,gmr # *vardef-gmr # @ macro定义的expanssion,使用设置进行开关 # "#xxx"进行macro的expanssion,避免所有word进行macro定义的字符串比较。 # sizeof/typeof/以rsv-wd定义,以macro函数expanssion。 # @ const # blank/newline seperated T_WORD # regex => lxr func after combine # string # digit # oct,0started # hex,0started # bin, # float @ expanssion # 输出到指定offset的buffer,根据expanssion时的state输出到不同buff。 # envar expanssion # subscript expanssion # macro expanssion # @ # txt + '',``,read until pair-char + sh/c99-singleline,read until nl。 + thisdoc/helpdoc,read until term-str + block-str({},(),$/)只进行pair-char的计数,匹配到right-pattern时,即是一个block。 + process pfx-char,count pairchar,when level = 0,read until end-str, # token combine # cmnt + sh/c99-singleline,read until nl。 + c-preproc,chk in sh-cmnt + c89/ext-multiline,使用Txt_xxx,只匹配/**/和/****/。 # dollar,$为pfx,设置pair-flag + (),$(),param-state,code-state + (()),$(()),calc-state + $[],calc-state + [[]],$[[]],sh-judge,calc-state + ${}, + $"",$'',$``,在"",'',``之后运行exit响应函数时,根据$标记对字符串进行处理。 # quoted-str + "",``,$的混合 # code/cmd/expr-state,;/nl,first token为T_WORD的表示cmd,为token的code状态。在()或(())中为expr状态。 # code + '',"",``, + (),{} + statement/cmd/expr的判断 - code状态下,第一个token为非T_WORD时,即是statement,仍以code状态运行。 - 开头的token为T_WORD,第二个token非=时,为cmd状态 - 第二个token为'='时,=之前的blank为0,且T_WORD不是变量名称,将两个token输出为T_ENVASSIGN,并设置cmd状态。 - 当第二个token为=,且非T_ENVASSIGN时,为expr状态 - @开头的语句,为var状态,根据.和->和::和=>获取var的member,return一个T_ATVAR的token,并设置为expr状态。 - expr状态以;切换到code状态。 - nl,或;,或&,或&&,或||时,从cmd状态返回到code状态 - source或include时,保存状态,new-file以code状态使用。 # @ token的combine # 在token读取函数之外添加wrap,对token进行处理。 # word combine # string combine # ENVASSIGN combine # var name combine # @ code # code # cmd # func-def # assign # expr # string # cmnt/macro # @ cmd statement # first token is word,second token is not ( or . or =。 # wordlist # ;,nl # &&,|| # & # |,<,> # @ regrx-str,在cmd状态时,以[[:blank:]]为seperator # second token进行"(","+=","=","+=(","=("的识别,并根据token之前的blank,判断是否为assignment,切换到不同的状态 # @ # {},() # then/else/elif/fi # do/done # [[/]] @ elem # declaration, # var-def,declaration_specifiers # func-def,function_definition # type-def,declaration_specifiers # macro-def, # statement(compound) + declaration/var-def/type-def/macro-def + assignment,assignment_expression + func-ivk,postfix_expression + compound,compound_statement + gmr-statement,statement + *cmd-statement # # # @ assignment # cmd的=后面是字符串,c语言的=后面是运行操作。 # "[[:alnum:]_]*=(",var=(1 2 3)和var=(int*)ptr;,chk env name,在lxr中返回assign_quote,在gmr中对这个token之后的token解析,来设置assign的类型。(env_arr,var) # "[[:alnum:]_]*=[^\ ]",如果=之前为env,使用cmd的assign。如果为dvar或external-symbol,使用lang-assign,=及后面的字符unput,当前word为T_VAR。 # 含"()"类型转换的assign时,"("的解析,如包含T_WORD,并且是变量type类型时,设置convert的state,其它的设置subscript。 # 含xxx.xxx的submember的assign,token在gmr中组织为语句。 # @ global # global的初始化,在init()或模块文件名同名的函数中初始化。 # @ env与var # env看成是字符串类型的var。使用$envar为const的字符串,使用@envar为字符串的ptr,@envar与var一样使用 @ 函数参数 # cmd-style的调用,对于c-func,进行类型转换 # 参数定义为型参,同时以$n访问参数字符串 # 对于参数定义个数之外的,以$n访问。 # 函数调用时"($@)"将参数"duplicate"到调用函数的参数区。 @ 根据if/for语句,浏览expr和statement的定义。 # expr # statement,根据定义中包含';'的项,浏览statement定义。 + compound_statement + expression_statement + selection_statement,iteration_statement + labeled_statement,jump_statement # declaration/declaration_specifiers + storage_class_specifier(TYPEDEF,EXTERN,STATIC,AUTO,REGISTER) + type_specifier(VOID,CHAR,SHORT,INT,LONG,FLOAT,DOUBLE,SIGNED,UNSIGNED,struct_or_union_specifier,enum_specifier,TYPE_NAME) + type_qualifier(CONST,VOLATILE) # () @ # statement : labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement ; # expression : assignment_expression | expression ',' assignment_expression ; # primary_expression : IDENTIFIER | CONSTANT | STRING_LITERAL | '(' expression ')' ; postfix_expression : primary_expression | postfix_expression '[' expression ']' | postfix_expression '(' ')' | postfix_expression '(' argument_expression_list ')' | postfix_expression '.' IDENTIFIER | postfix_expression PTR_OP IDENTIFIER | postfix_expression INC_OP | postfix_expression DEC_OP ; # \ No newline at end of file diff --git a/src/config/lxrgmr-code/AQStack.c b/src/config/lxrgmr-code/AQStack.c index 92f8ea1..46d677d 100644 --- a/src/config/lxrgmr-code/AQStack.c +++ b/src/config/lxrgmr-code/AQStack.c @@ -418,15 +418,17 @@ bool QStackIF_Push (QSTACK *pstQStack, CPU_UINT u32Data) if (pstQStack->count < pstQStack->size) { - pstQStack->opr->pfnSet(&pstQStack->buffer[pstQStack->tail], u32Data); //tailʼÖÕÖ¸Ïò×îºóÒ»¸öÔªËصÄÏÂÒ»¸öλÖà pstQStack->head = (pstQStack->head + pstQStack->size - pstQStack->opr->len) % pstQStack->size; + pstQStack->opr->pfnSet(&pstQStack->buffer[pstQStack->head], u32Data); + pstQStack->count+=pstQStack->opr->len; ret = true; } OS_EXIT_CRITICAL(pstQStack); + return ret; } @@ -969,7 +971,7 @@ XXX(Gerneral_Operation); *********************************************************************/ void QStackIF_SetDataOprType (PQSTACK pstQStack, uint32 u32Type) { - int mask; + CPU_UINT mask; OS_ENTER_CRITICAL(pstQStack); @@ -978,36 +980,36 @@ void QStackIF_SetDataOprType (PQSTACK pstQStack, uint32 u32Type) if (u32Type == OPR_UINT8) { pstQStack->opr = &gstUint8Opr; - mask = 0; + mask = ~0; } else if (u32Type == OPR_UINT16) { pstQStack->opr = &gstUint16Opr; - mask = 1; + mask = ~1; } else if (u32Type == OPR_UINT32) { pstQStack->opr = &gstUint32Opr; - mask = 2; + mask = ~2; } #ifdef CPU_UINT_64 else if (u32Type == OPR_UINT64) { pstQStack->opr = &gstUint64Opr; - mask = 3; + mask = ~3; } #endif else { pstQStack->opr = &gstUint8Opr; // pstQStack->type = OPR_UINT8; - mask = 0; + mask = ~0; } pstQStack->size &= mask; - pstQStack->head = 0; - pstQStack->tail = 0; - pstQStack->count = 0; +// pstQStack->head = 0; +// pstQStack->tail = 0; +// pstQStack->count = 0; OS_EXIT_CRITICAL(pstQStack); } @@ -1182,6 +1184,42 @@ uint32 QStackIF_BlankCnt (QSTACK *pstQStack) return ret; } +/********************************************************************* + * Ãû×Ö: QStackIF_PrintInfo + * ¹¦ÄÜ: Êä³ö½á¹¹ÌåµÄvarÐÅÏ¢¡£ + * ²ÎÊý: pstQStack£º¶ÓÁнṹÌåÖ¸Õë + * ·µ»Ø: void + *********************************************************************/ +void QStackIF_PrintInfo (QSTACK *pstQStack) +{ + /* use stderr to output info without buffer. */ + fprintf(stderr, "buffer = 0x%08x; ", (uint32)pstQStack->buffer); + fprintf(stderr, "size = %d;\n", pstQStack->size); + fprintf(stderr, "head = %d; ", pstQStack->head); + fprintf(stderr, "tail = %d; ", pstQStack->tail); + fprintf(stderr, "count = %d;\n", pstQStack->count); + fprintf(stderr, "opr = 0x%08x; ", (uint32)pstQStack->opr); + fprintf(stderr, "opr.len = %d;\n", pstQStack->opr->len); +} + +/********************************************************************* + * Ãû×Ö: QStackIF_PrintInfo + * ¹¦ÄÜ: Êä³övalid data¡£ + * ²ÎÊý: pstQStack£º¶ÓÁнṹÌåÖ¸Õë + * ·µ»Ø: void + *********************************************************************/ +void QStackIF_PrintBuff (QSTACK *pstQStack) +{ + CPU_UINT cpuData; + int i; + + for (i=0; icount/pstQStack->opr->len; i++) + { + fprintf(stderr, "data[%d] = 0x%08x; ", i, QStackIF_IndexRead(pstQStack, i)); + } + fprintf(stderr, "\n"); +} + diff --git a/src/config/lxrgmr-code/append_str.sh b/src/config/lxrgmr-code/append_str.sh deleted file mode 100644 index c7119a3..0000000 --- a/src/config/lxrgmr-code/append_str.sh +++ /dev/null @@ -1,7 +0,0 @@ -# !/bin/sh - - - -cp tokenname.var tokenname.var.bak -cat tokenname.var.bak | sed -E 's/,([ |\t]*)(T_[a-zA-Z0-9_]*)/,\1"\2",\1\2/g' > tokenname.var - diff --git a/src/config/lxrgmr-code/lxrgmr b/src/config/lxrgmr-code/lxrgmr deleted file mode 100644 index a80ed4804e9aaf06394e10a3009ac70bf8019b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 81012 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 diff --git a/src/config/lxrgmr-code/token/code.c b/src/config/lxrgmr-code/token/code.c index f5f38c0..e0d9b65 100644 --- a/src/config/lxrgmr-code/token/code.c +++ b/src/config/lxrgmr-code/token/code.c @@ -213,17 +213,18 @@ int on_sh_cmnt_proc (int evt, int token, register const char *str, register unsi while (1) { c = read_getc(psrcfile); + str_buff[str_idx] = c; + str_idx++; + str_buff[str_idx] = 0; + if (c == ' ' || c == '\t') break; if (c == '\n') return T_SH_CMNT; - - str_buff[str_idx] = c; - str_idx++; } str_buff[str_idx] = 0; - ret = Macro_TokenProc(str_buff, str_idx, gpcurr_src_file->pstCurrTokenState); + ret = Macro_TokenProc(&str_buff[1], str_idx-1, gpcurr_src_file->pstCurrTokenState); /* * no preproc cmd matching, it's a sh-cmnt. @@ -231,7 +232,7 @@ int on_sh_cmnt_proc (int evt, int token, register const char *str, register unsi */ if (ret != 0) return ret; - + mask_char = 0; pfx_char = 0; pair_begin = 0; @@ -424,6 +425,7 @@ int on_c89_cmnt (int evt, int token, register const char *str, register unsigned // do cmnt proc and return token. strcat(str_buff, "*/"); str_idx += 2; +// printf("str_idx=%d; str_buff='%s'\n", str_idx, str_buff); return T_C89_CMNT; } @@ -660,14 +662,14 @@ int Txt_TokenProc (char *str, TOKEN_TYPE type, TOKEN_PROC_STATE *pstTokenState) { if (blank_flag == 1) { - strcpy(str_buff, blank_str); + strcat(str_buff, blank_str); str_idx += strlen(blank_str); } strcat(str_buff, str); pstTokenState->token_len = strlen(str); str_idx += pstTokenState->token_len; - printf("Txt_TokenProc(%s) (%s) %d, %d\n", str_buff, str, pstTokenState->token_len, str_idx); +// printf("Txt_TokenProc(%s) (%s) %d, %d\n", str_buff, str, pstTokenState->token_len, str_idx); return T_SKIP; } diff --git "a/src/config/lxrgmr-code/token/tokenname - \345\211\257\346\234\254.var" "b/src/config/lxrgmr-code/token/tokenname - \345\211\257\346\234\254.var" deleted file mode 100644 index b49118c..0000000 --- "a/src/config/lxrgmr-code/token/tokenname - \345\211\257\346\234\254.var" +++ /dev/null @@ -1,358 +0,0 @@ - - -#define TOKEN_DECLARE(token, str, name) {NULL, str, 0, name, 0, 0, } -#define TOKEN_PROC_DECLARE(str, name) {NULL, str, 0, name, 0, &name##_PROC, } - -const struct token_id token_name_array[] = { - /* - * pfx-token - */ - TOKEN_DECLARE("$", T_DOLLAR, ), - TOKEN_DECLARE("$VAR"}, T_ENVAR, ), - TOKEN_DECLARE("$SCR"}, T_SUBSCRIPT, ), - - TOKEN_DECLARE("//"}, T_C99_CMNT_HDR, ), - TOKEN_DECLARE("#"}, T_SH_CMNT_HDR, ), -// TOKEN_DECLARE("#"}, T_SHARP, ), - - TOKEN_DECLARE("// XX"}, T_C99_CMNT, ), - TOKEN_DECLARE("# XX", T_SH_CMNT, ), - - /* OPTIONS */ -// { .chars={"-"}, "T_SUB", STATE_CODE, T_SUB, TF_PFX, &on_c99_cmnt_proc }, - TOKEN_DECLARE("-", T_OPT, ), - TOKEN_DECLARE("-gt", T_OPT_GT, ), - TOKEN_DECLARE("-ge", T_OPT_GE, ), - TOKEN_DECLARE("-lt", T_OPT_LT, ), - TOKEN_DECLARE("-le", T_OPT_LE, ), - TOKEN_DECLARE("-eq", T_OPT_EQ, ), - TOKEN_DECLARE("v", T_OPT_V, ), - TOKEN_DECLARE("-n", T_OPT_N, ), - TOKEN_DECLARE("-z", T_OPT_Z, ), - - TOKEN_DECLARE("-r", T_OPT_P, ), - TOKEN_DECLARE("-w", T_OPT_P, ), - TOKEN_DECLARE("-x", T_OPT_P, ), - TOKEN_DECLARE("-g", T_OPT_P, ), - TOKEN_DECLARE("-u", T_OPT_P, ), - - TOKEN_DECLARE("-e", T_OPT_E, ), - TOKEN_DECLARE("-a", T_OPT_A, ), - TOKEN_DECLARE("-f", T_OPT_F, ), - TOKEN_DECLARE("-s", T_OPT_S, ), - TOKEN_DECLARE("-d", T_OPT_D, ), - TOKEN_DECLARE("-b", T_OPT_B, ), - TOKEN_DECLARE("-c", T_OPT_C, ), - TOKEN_DECLARE("-p", T_OPT_P, ), - TOKEN_DECLARE("-O", T_OPT_UO, ), // owner - TOKEN_DECLARE("-G", T_OPT_UG, ), // GID - - TOKEN_DECLARE("-nt", T_OPT_NT, ), - TOKEN_DECLARE("-ot", T_OPT_OT, ), - TOKEN_DECLARE("-ef", T_OPT_EF, ), - - TOKEN_DECLARE("-h", T_OPT_H, ), // link - TOKEN_DECLARE("-L", T_OPT_UL, ), // link - TOKEN_DECLARE("-S", T_OPT_US, ), // socket - TOKEN_DECLARE("-t", T_OPT_UT, ), // term dev - TOKEN_DECLARE("-k", T_OPT_K, ), // stick - TOKEN_DECLARE("-N", T_OPT_UN, ), // modified unitl read - - TOKEN_DECLARE("!", T_EXCLAM, ); - -/* cmnt */ - TOKEN_DECLARE("@", T_AT, ), - TOKEN_DECLARE("\\", T_BACKSLASH, ), - -// TOKEN_DECLARE("::", T_DCOLON, ), -// TOKEN_DECLARE(":", T_COLON, ), - -// TOKEN_DECLARE("<", "T_LT", 0, T_LT, TF_PFX, &on_dollar_proc }, -// TOKEN_DECLARE(">", "T_GT", 0, T_GT, TF_PFX, &on_dollar_proc }, - - - /* - * paired-token - */ -// { {"/****/"}, "T_EXT_CMNT_HDR", STATE_TEXT_CMNT, T_EXT_CMNT_HDR, TF_OPCHAR, on_ext_cmnt }, -// { {"/**/"}, "T_C89_CMNT_HDR", STATE_TEXT_CMNT, T_C89_CMNT_HDR, TF_OPCHAR, on_c89_cmnt }, - TOKEN_DECLARE("/**", T_EXT_CMNT_HDR, ), - TOKEN_DECLARE("**/", T_EXT_CMNT_TAIL, ), - TOKEN_DECLARE("/*", T_C89_CMNT_HDR, ), - TOKEN_DECLARE("*/", T_C89_CMNT_TAIL, ), - - TOKEN_DECLARE("", T_C89_CMNT, ), - -// { {"\"\""}, "T_DQUOTE", STATE_CODE, ), -// { {"''"}, "T_QUOTE", STATE_CODE, ), -// { {"``"}, T_BACK_QUOTE, ), - - TOKEN_DECLARE("\"", T_DQUOTE, ), - TOKEN_DECLARE("'", T_QUOTE, ), - TOKEN_DECLARE("`", T_BACK_QUOTE, ), - - TOKEN_DECLARE("'", T_WORD_QUOTE, ), - TOKEN_DECLARE("'", T_WORD_QUOTE_FMT, ), - TOKEN_DECLARE("'", T_WORD_QUOTE_ENV, ), - TOKEN_DECLARE("'", T_WORD, ), - TOKEN_DECLARE("'", T_WORD_FMT, ), - TOKEN_DECLARE("", T_WORD_ENV, ), - - /* CODE */ -// { {"()"}, "T_LBRACKET1", STATE_CODE, T_LBRACKET1, TF_OPCHAR, on_bracket1 }, - TOKEN_DECLARE("(", T_LBRACKET1, ), - TOKEN_DECLARE(")", T_RBRACKET1, ), - -// { {"[]"}, "T_LBRACKET2", STATE_CODE, T_LBRACKET2, TF_OPCHAR, NULL }, - TOKEN_DECLARE("[", T_LBRACKET2, ), - TOKEN_DECLARE("]", T_RBRACKET2, ), - -// { {"{}"}, "T_LBRACKET3", STATE_CODE, T_LBRACKET3, TF_OPCHAR, on_bracket3 }, - TOKEN_DECLARE("{", T_LBRACKET3, ), - TOKEN_DECLARE("}", T_RBRACKET3, ), - -// { {"(())"}, "T_DLBRACKET1", STATE_EXPR, T_DLBRACKET1, TF_OPCHAR, NULL }, - TOKEN_DECLARE("((", T_DLBRACKET1, ), - TOKEN_DECLARE("))", T_DRBRACKET1, ), - - /* CMNT */ -// { {"<>"}, "T_CMNT_LTAG", STATE_CODE, T_CMNT_LTAG, TF_OPCHAR, on_ext_cmnt }, - TOKEN_DECLARE("<", T_CMNT_LTAG, ), - TOKEN_DECLARE(">", T_CMNT_RTAG, ), - - /* cmdline */ -// { .chars={"[[]]"}, T_DLBRACKET2, TF_OPCHAR, NULL }, - TOKEN_DECLARE("[[", T_DLBRACKET2, ), - TOKEN_DECLARE("]]", T_DRBRACKET2, ), - - - /* - * opr-token - */ - /* expr */ - TOKEN_DECLARE("...", T_ELIPSE, ), - - TOKEN_DECLARE(".", T_POINT, ), - TOKEN_DECLARE("::", T_DCOLON, ), - TOKEN_DECLARE("->", T_POINTER, ), - TOKEN_DECLARE("=>", T_REF_PTR, ), - - TOKEN_DECLARE(":", T_COLON, ), - TOKEN_DECLARE("?", T_QUESTION, ), - - TOKEN_DECLARE("=", T_EQUAL, ), - TOKEN_DECLARE("+=", T_ADDEQUAL, ), - TOKEN_DECLARE("-=", T_SUBEQUAL, ), - TOKEN_DECLARE("*=", T_MULEQUAL, ), - TOKEN_DECLARE("/=", T_DIVEQUAL, ), - TOKEN_DECLARE("%=", T_MODEQUAL, ), - TOKEN_DECLARE("^^=", T_POWEQUAL, ), - - TOKEN_DECLARE("&=", T_ANDEQUAL, ), - TOKEN_DECLARE("|=", T_OREQUAL, ), - TOKEN_DECLARE("^=", T_XOREQUAL, ), - TOKEN_DECLARE("<<=", T_LSHIFTEQUAL, ), - TOKEN_DECLARE(">>=", T_RSHIFTEQUAL, ), - - TOKEN_DECLARE("==", T_DEQUAL, ), - TOKEN_DECLARE("!=", T_NOTEQUAL, ), - TOKEN_DECLARE(">=", T_GE, ), - TOKEN_DECLARE("<=", T_LE, ), - TOKEN_DECLARE(">", T_GT, ), // - TOKEN_DECLARE("<", T_LT, ), // - - TOKEN_DECLARE("+", T_ADD, ), - TOKEN_DECLARE("-", T_SUB, ), - TOKEN_DECLARE("*", T_MUL, ), - TOKEN_DECLARE("/", T_DIV, ), - TOKEN_DECLARE("%", T_MOD, ), - TOKEN_DECLARE("^^", T_POW, ), - - TOKEN_DECLARE("!", T_NOT, ), - TOKEN_DECLARE("&&", T_DAND, ), - TOKEN_DECLARE("||", T_DOR, ), - - TOKEN_DECLARE("&", T_AND, ), - TOKEN_DECLARE("|", T_OR, ), - TOKEN_DECLARE("~", T_REVERSE, ), - TOKEN_DECLARE("^", T_XOR, ), - TOKEN_DECLARE(">>", T_RSHIFT, ), - TOKEN_DECLARE("<<", T_LSHIFT, ), - - TOKEN_DECLARE(",", T_COMMA, ), - TOKEN_DECLARE(";", T_SEMI, ), - - /* cmdline */ - // ;, <, >, &&, ||, - // $, @, =, +=, - TOKEN_DECLARE("&", T_BACKGROUND, ), - TOKEN_DECLARE("|", T_PIPE, ), - - TOKEN_DECLARE(";;", T_DSEMI, ), - - TOKEN_DECLARE("<<", T_DLT, ), - TOKEN_DECLARE(">>", T_DGT, ), - TOKEN_DECLARE("<<<", T_TLT, ), - TOKEN_DECLARE("<>", T_LTGT, ), - TOKEN_DECLARE(">&", T_GT_AND, ), - TOKEN_DECLARE("<&", T_LT_AND, ), - TOKEN_DECLARE("<>&", T_LTGT_AND, ), - TOKEN_DECLARE(">&-", T_GT_AND_BAR, ), - TOKEN_DECLARE("<&-", T_LT_AND_BAR, ), - TOKEN_DECLARE("<>&-", T_LTGT_AND_BAR, ), - - - /* envar */ - TOKEN_DECLARE("!", T_ENVREF, ), -// TOKEN_DECLARE("#", T_SHARP, ), - -// { .chars={"/"}, "T_SPLASH", STATE_CODE, ), -// { .chars={"*"}, "T_STAR", STATE_CODE, T_STAR, TF_OPCHAR, NULL }, -// { .chars={":"}, "T_COLON", STATE_CODE, T_COLON, TF_OPCHAR, NULL }, - TOKEN_DECLARE("%", T_PERCENT, ), - TOKEN_DECLARE("*", T_STAR, ), - TOKEN_DECLARE("#", T_SHARP, ), - TOKEN_DECLARE("//", T_DSPLASH, ), - TOKEN_DECLARE("##", T_DSHARP, ), - TOKEN_DECLARE("%%", T_DPERCENT, ), - - TOKEN_DECLARE(",,", T_DCOMMA, ), - TOKEN_DECLARE("^^", T_DCARET, ), - -// { .chars={"-"}, "T_SUB", STATE_CODE, T_SUB, TF_OPCHAR, NULL }, -// { .chars={"="}, "T_EQUAL", STATE_CODE, T_EQUAL, TF_OPCHAR, NULL }, -// { .chars={"+"}, "T_ADD", STATE_CODE, T_ADD, TF_OPCHAR, NULL }, -// { .chars={"?"}, "T_QUESTION", STATE_CODE, T_QUESTION, TF_OPCHAR, NULL }, - TOKEN_DECLARE(":-", T_COLONSUB, ), - TOKEN_DECLARE(":=", T_COLONEQUAL, ), - TOKEN_DECLARE(":+", T_COLONADD, ), - TOKEN_DECLARE(":?", T_COLONQUESTION, ), - - TOKEN_DECLARE("#%", T_SIDECUT, ), - TOKEN_DECLARE("##%%", T_STR_QUOTE, ), - TOKEN_DECLARE("|", T_SPLIT, ), - TOKEN_DECLARE("<>", T_STRIP, ), - TOKEN_DECLARE("<|>", T_SPLIT_STRIP, ), - TOKEN_DECLARE("~", T_WILDCAST, ), - - - /* - * rsv-word - */ - /* clang */ - TOKEN_DECLARE("NULL", T_NULL, ), - TOKEN_DECLARE("true", T_TRUE, ), - TOKEN_DECLARE("false", T_FALSE, ), - - TOKEN_DECLARE("if", T_IF, ), - TOKEN_DECLARE("else", T_ELSE, ), - TOKEN_DECLARE("for", T_FOR, ), - TOKEN_DECLARE("do", T_DO, ), - TOKEN_DECLARE("while", T_WHILE, ), - TOKEN_DECLARE("until", T_UNTIL, ), - TOKEN_DECLARE("switch", T_SWITCH, ), - TOKEN_DECLARE("case", T_CASE, ), - TOKEN_DECLARE("continue", T_CONTINUE, ), - TOKEN_DECLARE("break", T_BREAK, ), - TOKEN_DECLARE("default", T_DEFAULT, ), - TOKEN_DECLARE("return", T_RETURN, ), - - TOKEN_DECLARE("sizeof", T_SIZEOF, ), - TOKEN_DECLARE("typeof", T_TYPEOF, ), - - TOKEN_DECLARE("auto", T_AUTO, ), - TOKEN_DECLARE("register", T_REGISTER, ), - TOKEN_DECLARE("const", T_CONST, ), - TOKEN_DECLARE("static", T_STATIC, ), - TOKEN_DECLARE("volatile", T_VOLATILE, ), - TOKEN_DECLARE("extern", T_EXTERN, ), - - TOKEN_DECLARE("typedef", T_TYPEDEF, ), - TOKEN_DECLARE("struct", T_STRUCT, ), - TOKEN_DECLARE("union", T_UNION, ), - TOKEN_DECLARE("enum", T_ENUM, ), - - /* - * sh-script - */ - TOKEN_DECLARE("function", T_FUNC, ), - TOKEN_DECLARE("then", T_THEN, ), - TOKEN_DECLARE("fi", T_FI, ), - TOKEN_DECLARE("elif", T_ELIF, ), - TOKEN_DECLARE("esac", T_ESAC, ), - TOKEN_DECLARE("done", T_DONE, ), - TOKEN_DECLARE("in", T_IN, ), - TOKEN_DECLARE("select", T_SELECT, ), - - /* - * extension - */ - TOKEN_DECLARE("packet", T_PACKET, ), - - TOKEN_DECLARE("foreach", T_FOREACH, ), - TOKEN_DECLARE("judge", T_JUDGE, ), - TOKEN_DECLARE("judgement", T_JUDGEMENT, ), - TOKEN_DECLARE("condition", T_CONDITION, ), - TOKEN_DECLARE("cond", T_COND, ), - TOKEN_DECLARE("condef", T_CONDEF, ), - TOKEN_DECLARE("res", T_RES, ), - TOKEN_DECLARE("request", T_REQUEST, ), - TOKEN_DECLARE("failed", T_FAILED, ), - -// { "try", "T_TRY", STATE_CODE, T_TRY, ), - TOKEN_DECLARE("exception", T_EXCEPTION, ), -// { "throw", "T_THROW", STATE_CODE, T_THROW, ), - TOKEN_DECLARE("run", T_RUN, ), - TOKEN_DECLARE("trig", T_TRIG, ), - - TOKEN_DECLARE("api", T_API, ), - TOKEN_DECLARE("public", T_PUBLIC, ), - TOKEN_DECLARE("private", T_PRIVATE, ), - TOKEN_DECLARE("property", T_PROPERTY, ), - TOKEN_DECLARE("rtf", T_RTF, ), - TOKEN_DECLARE("overide", T_OVERIDE, ), - TOKEN_DECLARE("weak", T_WEAK, ), - TOKEN_DECLARE("alias", T_ALIAS, ), - - TOKEN_DECLARE("this", T_THIS, ), - TOKEN_DECLARE("thus", T_THUS, ), - - TOKEN_DECLARE("global", T_GLOBAL, ), - TOKEN_DECLARE("local", T_LOCAL, ), - TOKEN_DECLARE("system", T_SYSTEM, ), - -// TOKEN_DECLARE("condition", T_DEFAULT, ), - - TOKEN_DECLARE("numof", T_NUMOF, ), - - -/* cmnt tag */ - TOKEN_DECLARE("var", T_TAG_VAR, ), - TOKEN_DECLARE("file", T_TAG_FILE, ), - TOKEN_DECLARE("func", T_TAG_FUNC, ), - TOKEN_DECLARE("brief", T_TAG_BRIEF, ), - TOKEN_DECLARE("param", T_TAG_PARAM, ), - TOKEN_DECLARE("return", T_TAG_RETURN, ), - TOKEN_DECLARE("retval", T_TAG_RETVAL, ), - TOKEN_DECLARE("note", T_TAG_NOTE, ), - TOKEN_DECLARE("error", T_TAG_ERROR, ), - TOKEN_DECLARE("tag", T_TAG_TAG, ), - TOKEN_DECLARE("section", T_TAG_SECTION, ), - -/* MACRO */ - TOKEN_DECLARE("include", T_MINCLUDE, ), - TOKEN_DECLARE("ifndef", T_MIFNDEF, ), - TOKEN_DECLARE("define", T_MDEFINE, ), - TOKEN_DECLARE("pragma", T_MPRAGMA, ), - TOKEN_DECLARE("ifdef", T_MIFDEF, ), - TOKEN_DECLARE("endif", T_MENDIF, ), - TOKEN_DECLARE("else", T_MELSE, ), - TOKEN_DECLARE("link", T_MLINK, ), - TOKEN_DECLARE("if", T_MIF, ), - - { NULL, NULL, 0, 0, 0, 0 }, -}; - - - - diff --git a/src/config/lxrgmr-code/token/tokenname.var.bak b/src/config/lxrgmr-code/token/tokenname.var.bak deleted file mode 100644 index b49118c..0000000 --- a/src/config/lxrgmr-code/token/tokenname.var.bak +++ /dev/null @@ -1,358 +0,0 @@ - - -#define TOKEN_DECLARE(token, str, name) {NULL, str, 0, name, 0, 0, } -#define TOKEN_PROC_DECLARE(str, name) {NULL, str, 0, name, 0, &name##_PROC, } - -const struct token_id token_name_array[] = { - /* - * pfx-token - */ - TOKEN_DECLARE("$", T_DOLLAR, ), - TOKEN_DECLARE("$VAR"}, T_ENVAR, ), - TOKEN_DECLARE("$SCR"}, T_SUBSCRIPT, ), - - TOKEN_DECLARE("//"}, T_C99_CMNT_HDR, ), - TOKEN_DECLARE("#"}, T_SH_CMNT_HDR, ), -// TOKEN_DECLARE("#"}, T_SHARP, ), - - TOKEN_DECLARE("// XX"}, T_C99_CMNT, ), - TOKEN_DECLARE("# XX", T_SH_CMNT, ), - - /* OPTIONS */ -// { .chars={"-"}, "T_SUB", STATE_CODE, T_SUB, TF_PFX, &on_c99_cmnt_proc }, - TOKEN_DECLARE("-", T_OPT, ), - TOKEN_DECLARE("-gt", T_OPT_GT, ), - TOKEN_DECLARE("-ge", T_OPT_GE, ), - TOKEN_DECLARE("-lt", T_OPT_LT, ), - TOKEN_DECLARE("-le", T_OPT_LE, ), - TOKEN_DECLARE("-eq", T_OPT_EQ, ), - TOKEN_DECLARE("v", T_OPT_V, ), - TOKEN_DECLARE("-n", T_OPT_N, ), - TOKEN_DECLARE("-z", T_OPT_Z, ), - - TOKEN_DECLARE("-r", T_OPT_P, ), - TOKEN_DECLARE("-w", T_OPT_P, ), - TOKEN_DECLARE("-x", T_OPT_P, ), - TOKEN_DECLARE("-g", T_OPT_P, ), - TOKEN_DECLARE("-u", T_OPT_P, ), - - TOKEN_DECLARE("-e", T_OPT_E, ), - TOKEN_DECLARE("-a", T_OPT_A, ), - TOKEN_DECLARE("-f", T_OPT_F, ), - TOKEN_DECLARE("-s", T_OPT_S, ), - TOKEN_DECLARE("-d", T_OPT_D, ), - TOKEN_DECLARE("-b", T_OPT_B, ), - TOKEN_DECLARE("-c", T_OPT_C, ), - TOKEN_DECLARE("-p", T_OPT_P, ), - TOKEN_DECLARE("-O", T_OPT_UO, ), // owner - TOKEN_DECLARE("-G", T_OPT_UG, ), // GID - - TOKEN_DECLARE("-nt", T_OPT_NT, ), - TOKEN_DECLARE("-ot", T_OPT_OT, ), - TOKEN_DECLARE("-ef", T_OPT_EF, ), - - TOKEN_DECLARE("-h", T_OPT_H, ), // link - TOKEN_DECLARE("-L", T_OPT_UL, ), // link - TOKEN_DECLARE("-S", T_OPT_US, ), // socket - TOKEN_DECLARE("-t", T_OPT_UT, ), // term dev - TOKEN_DECLARE("-k", T_OPT_K, ), // stick - TOKEN_DECLARE("-N", T_OPT_UN, ), // modified unitl read - - TOKEN_DECLARE("!", T_EXCLAM, ); - -/* cmnt */ - TOKEN_DECLARE("@", T_AT, ), - TOKEN_DECLARE("\\", T_BACKSLASH, ), - -// TOKEN_DECLARE("::", T_DCOLON, ), -// TOKEN_DECLARE(":", T_COLON, ), - -// TOKEN_DECLARE("<", "T_LT", 0, T_LT, TF_PFX, &on_dollar_proc }, -// TOKEN_DECLARE(">", "T_GT", 0, T_GT, TF_PFX, &on_dollar_proc }, - - - /* - * paired-token - */ -// { {"/****/"}, "T_EXT_CMNT_HDR", STATE_TEXT_CMNT, T_EXT_CMNT_HDR, TF_OPCHAR, on_ext_cmnt }, -// { {"/**/"}, "T_C89_CMNT_HDR", STATE_TEXT_CMNT, T_C89_CMNT_HDR, TF_OPCHAR, on_c89_cmnt }, - TOKEN_DECLARE("/**", T_EXT_CMNT_HDR, ), - TOKEN_DECLARE("**/", T_EXT_CMNT_TAIL, ), - TOKEN_DECLARE("/*", T_C89_CMNT_HDR, ), - TOKEN_DECLARE("*/", T_C89_CMNT_TAIL, ), - - TOKEN_DECLARE("", T_C89_CMNT, ), - -// { {"\"\""}, "T_DQUOTE", STATE_CODE, ), -// { {"''"}, "T_QUOTE", STATE_CODE, ), -// { {"``"}, T_BACK_QUOTE, ), - - TOKEN_DECLARE("\"", T_DQUOTE, ), - TOKEN_DECLARE("'", T_QUOTE, ), - TOKEN_DECLARE("`", T_BACK_QUOTE, ), - - TOKEN_DECLARE("'", T_WORD_QUOTE, ), - TOKEN_DECLARE("'", T_WORD_QUOTE_FMT, ), - TOKEN_DECLARE("'", T_WORD_QUOTE_ENV, ), - TOKEN_DECLARE("'", T_WORD, ), - TOKEN_DECLARE("'", T_WORD_FMT, ), - TOKEN_DECLARE("", T_WORD_ENV, ), - - /* CODE */ -// { {"()"}, "T_LBRACKET1", STATE_CODE, T_LBRACKET1, TF_OPCHAR, on_bracket1 }, - TOKEN_DECLARE("(", T_LBRACKET1, ), - TOKEN_DECLARE(")", T_RBRACKET1, ), - -// { {"[]"}, "T_LBRACKET2", STATE_CODE, T_LBRACKET2, TF_OPCHAR, NULL }, - TOKEN_DECLARE("[", T_LBRACKET2, ), - TOKEN_DECLARE("]", T_RBRACKET2, ), - -// { {"{}"}, "T_LBRACKET3", STATE_CODE, T_LBRACKET3, TF_OPCHAR, on_bracket3 }, - TOKEN_DECLARE("{", T_LBRACKET3, ), - TOKEN_DECLARE("}", T_RBRACKET3, ), - -// { {"(())"}, "T_DLBRACKET1", STATE_EXPR, T_DLBRACKET1, TF_OPCHAR, NULL }, - TOKEN_DECLARE("((", T_DLBRACKET1, ), - TOKEN_DECLARE("))", T_DRBRACKET1, ), - - /* CMNT */ -// { {"<>"}, "T_CMNT_LTAG", STATE_CODE, T_CMNT_LTAG, TF_OPCHAR, on_ext_cmnt }, - TOKEN_DECLARE("<", T_CMNT_LTAG, ), - TOKEN_DECLARE(">", T_CMNT_RTAG, ), - - /* cmdline */ -// { .chars={"[[]]"}, T_DLBRACKET2, TF_OPCHAR, NULL }, - TOKEN_DECLARE("[[", T_DLBRACKET2, ), - TOKEN_DECLARE("]]", T_DRBRACKET2, ), - - - /* - * opr-token - */ - /* expr */ - TOKEN_DECLARE("...", T_ELIPSE, ), - - TOKEN_DECLARE(".", T_POINT, ), - TOKEN_DECLARE("::", T_DCOLON, ), - TOKEN_DECLARE("->", T_POINTER, ), - TOKEN_DECLARE("=>", T_REF_PTR, ), - - TOKEN_DECLARE(":", T_COLON, ), - TOKEN_DECLARE("?", T_QUESTION, ), - - TOKEN_DECLARE("=", T_EQUAL, ), - TOKEN_DECLARE("+=", T_ADDEQUAL, ), - TOKEN_DECLARE("-=", T_SUBEQUAL, ), - TOKEN_DECLARE("*=", T_MULEQUAL, ), - TOKEN_DECLARE("/=", T_DIVEQUAL, ), - TOKEN_DECLARE("%=", T_MODEQUAL, ), - TOKEN_DECLARE("^^=", T_POWEQUAL, ), - - TOKEN_DECLARE("&=", T_ANDEQUAL, ), - TOKEN_DECLARE("|=", T_OREQUAL, ), - TOKEN_DECLARE("^=", T_XOREQUAL, ), - TOKEN_DECLARE("<<=", T_LSHIFTEQUAL, ), - TOKEN_DECLARE(">>=", T_RSHIFTEQUAL, ), - - TOKEN_DECLARE("==", T_DEQUAL, ), - TOKEN_DECLARE("!=", T_NOTEQUAL, ), - TOKEN_DECLARE(">=", T_GE, ), - TOKEN_DECLARE("<=", T_LE, ), - TOKEN_DECLARE(">", T_GT, ), // - TOKEN_DECLARE("<", T_LT, ), // - - TOKEN_DECLARE("+", T_ADD, ), - TOKEN_DECLARE("-", T_SUB, ), - TOKEN_DECLARE("*", T_MUL, ), - TOKEN_DECLARE("/", T_DIV, ), - TOKEN_DECLARE("%", T_MOD, ), - TOKEN_DECLARE("^^", T_POW, ), - - TOKEN_DECLARE("!", T_NOT, ), - TOKEN_DECLARE("&&", T_DAND, ), - TOKEN_DECLARE("||", T_DOR, ), - - TOKEN_DECLARE("&", T_AND, ), - TOKEN_DECLARE("|", T_OR, ), - TOKEN_DECLARE("~", T_REVERSE, ), - TOKEN_DECLARE("^", T_XOR, ), - TOKEN_DECLARE(">>", T_RSHIFT, ), - TOKEN_DECLARE("<<", T_LSHIFT, ), - - TOKEN_DECLARE(",", T_COMMA, ), - TOKEN_DECLARE(";", T_SEMI, ), - - /* cmdline */ - // ;, <, >, &&, ||, - // $, @, =, +=, - TOKEN_DECLARE("&", T_BACKGROUND, ), - TOKEN_DECLARE("|", T_PIPE, ), - - TOKEN_DECLARE(";;", T_DSEMI, ), - - TOKEN_DECLARE("<<", T_DLT, ), - TOKEN_DECLARE(">>", T_DGT, ), - TOKEN_DECLARE("<<<", T_TLT, ), - TOKEN_DECLARE("<>", T_LTGT, ), - TOKEN_DECLARE(">&", T_GT_AND, ), - TOKEN_DECLARE("<&", T_LT_AND, ), - TOKEN_DECLARE("<>&", T_LTGT_AND, ), - TOKEN_DECLARE(">&-", T_GT_AND_BAR, ), - TOKEN_DECLARE("<&-", T_LT_AND_BAR, ), - TOKEN_DECLARE("<>&-", T_LTGT_AND_BAR, ), - - - /* envar */ - TOKEN_DECLARE("!", T_ENVREF, ), -// TOKEN_DECLARE("#", T_SHARP, ), - -// { .chars={"/"}, "T_SPLASH", STATE_CODE, ), -// { .chars={"*"}, "T_STAR", STATE_CODE, T_STAR, TF_OPCHAR, NULL }, -// { .chars={":"}, "T_COLON", STATE_CODE, T_COLON, TF_OPCHAR, NULL }, - TOKEN_DECLARE("%", T_PERCENT, ), - TOKEN_DECLARE("*", T_STAR, ), - TOKEN_DECLARE("#", T_SHARP, ), - TOKEN_DECLARE("//", T_DSPLASH, ), - TOKEN_DECLARE("##", T_DSHARP, ), - TOKEN_DECLARE("%%", T_DPERCENT, ), - - TOKEN_DECLARE(",,", T_DCOMMA, ), - TOKEN_DECLARE("^^", T_DCARET, ), - -// { .chars={"-"}, "T_SUB", STATE_CODE, T_SUB, TF_OPCHAR, NULL }, -// { .chars={"="}, "T_EQUAL", STATE_CODE, T_EQUAL, TF_OPCHAR, NULL }, -// { .chars={"+"}, "T_ADD", STATE_CODE, T_ADD, TF_OPCHAR, NULL }, -// { .chars={"?"}, "T_QUESTION", STATE_CODE, T_QUESTION, TF_OPCHAR, NULL }, - TOKEN_DECLARE(":-", T_COLONSUB, ), - TOKEN_DECLARE(":=", T_COLONEQUAL, ), - TOKEN_DECLARE(":+", T_COLONADD, ), - TOKEN_DECLARE(":?", T_COLONQUESTION, ), - - TOKEN_DECLARE("#%", T_SIDECUT, ), - TOKEN_DECLARE("##%%", T_STR_QUOTE, ), - TOKEN_DECLARE("|", T_SPLIT, ), - TOKEN_DECLARE("<>", T_STRIP, ), - TOKEN_DECLARE("<|>", T_SPLIT_STRIP, ), - TOKEN_DECLARE("~", T_WILDCAST, ), - - - /* - * rsv-word - */ - /* clang */ - TOKEN_DECLARE("NULL", T_NULL, ), - TOKEN_DECLARE("true", T_TRUE, ), - TOKEN_DECLARE("false", T_FALSE, ), - - TOKEN_DECLARE("if", T_IF, ), - TOKEN_DECLARE("else", T_ELSE, ), - TOKEN_DECLARE("for", T_FOR, ), - TOKEN_DECLARE("do", T_DO, ), - TOKEN_DECLARE("while", T_WHILE, ), - TOKEN_DECLARE("until", T_UNTIL, ), - TOKEN_DECLARE("switch", T_SWITCH, ), - TOKEN_DECLARE("case", T_CASE, ), - TOKEN_DECLARE("continue", T_CONTINUE, ), - TOKEN_DECLARE("break", T_BREAK, ), - TOKEN_DECLARE("default", T_DEFAULT, ), - TOKEN_DECLARE("return", T_RETURN, ), - - TOKEN_DECLARE("sizeof", T_SIZEOF, ), - TOKEN_DECLARE("typeof", T_TYPEOF, ), - - TOKEN_DECLARE("auto", T_AUTO, ), - TOKEN_DECLARE("register", T_REGISTER, ), - TOKEN_DECLARE("const", T_CONST, ), - TOKEN_DECLARE("static", T_STATIC, ), - TOKEN_DECLARE("volatile", T_VOLATILE, ), - TOKEN_DECLARE("extern", T_EXTERN, ), - - TOKEN_DECLARE("typedef", T_TYPEDEF, ), - TOKEN_DECLARE("struct", T_STRUCT, ), - TOKEN_DECLARE("union", T_UNION, ), - TOKEN_DECLARE("enum", T_ENUM, ), - - /* - * sh-script - */ - TOKEN_DECLARE("function", T_FUNC, ), - TOKEN_DECLARE("then", T_THEN, ), - TOKEN_DECLARE("fi", T_FI, ), - TOKEN_DECLARE("elif", T_ELIF, ), - TOKEN_DECLARE("esac", T_ESAC, ), - TOKEN_DECLARE("done", T_DONE, ), - TOKEN_DECLARE("in", T_IN, ), - TOKEN_DECLARE("select", T_SELECT, ), - - /* - * extension - */ - TOKEN_DECLARE("packet", T_PACKET, ), - - TOKEN_DECLARE("foreach", T_FOREACH, ), - TOKEN_DECLARE("judge", T_JUDGE, ), - TOKEN_DECLARE("judgement", T_JUDGEMENT, ), - TOKEN_DECLARE("condition", T_CONDITION, ), - TOKEN_DECLARE("cond", T_COND, ), - TOKEN_DECLARE("condef", T_CONDEF, ), - TOKEN_DECLARE("res", T_RES, ), - TOKEN_DECLARE("request", T_REQUEST, ), - TOKEN_DECLARE("failed", T_FAILED, ), - -// { "try", "T_TRY", STATE_CODE, T_TRY, ), - TOKEN_DECLARE("exception", T_EXCEPTION, ), -// { "throw", "T_THROW", STATE_CODE, T_THROW, ), - TOKEN_DECLARE("run", T_RUN, ), - TOKEN_DECLARE("trig", T_TRIG, ), - - TOKEN_DECLARE("api", T_API, ), - TOKEN_DECLARE("public", T_PUBLIC, ), - TOKEN_DECLARE("private", T_PRIVATE, ), - TOKEN_DECLARE("property", T_PROPERTY, ), - TOKEN_DECLARE("rtf", T_RTF, ), - TOKEN_DECLARE("overide", T_OVERIDE, ), - TOKEN_DECLARE("weak", T_WEAK, ), - TOKEN_DECLARE("alias", T_ALIAS, ), - - TOKEN_DECLARE("this", T_THIS, ), - TOKEN_DECLARE("thus", T_THUS, ), - - TOKEN_DECLARE("global", T_GLOBAL, ), - TOKEN_DECLARE("local", T_LOCAL, ), - TOKEN_DECLARE("system", T_SYSTEM, ), - -// TOKEN_DECLARE("condition", T_DEFAULT, ), - - TOKEN_DECLARE("numof", T_NUMOF, ), - - -/* cmnt tag */ - TOKEN_DECLARE("var", T_TAG_VAR, ), - TOKEN_DECLARE("file", T_TAG_FILE, ), - TOKEN_DECLARE("func", T_TAG_FUNC, ), - TOKEN_DECLARE("brief", T_TAG_BRIEF, ), - TOKEN_DECLARE("param", T_TAG_PARAM, ), - TOKEN_DECLARE("return", T_TAG_RETURN, ), - TOKEN_DECLARE("retval", T_TAG_RETVAL, ), - TOKEN_DECLARE("note", T_TAG_NOTE, ), - TOKEN_DECLARE("error", T_TAG_ERROR, ), - TOKEN_DECLARE("tag", T_TAG_TAG, ), - TOKEN_DECLARE("section", T_TAG_SECTION, ), - -/* MACRO */ - TOKEN_DECLARE("include", T_MINCLUDE, ), - TOKEN_DECLARE("ifndef", T_MIFNDEF, ), - TOKEN_DECLARE("define", T_MDEFINE, ), - TOKEN_DECLARE("pragma", T_MPRAGMA, ), - TOKEN_DECLARE("ifdef", T_MIFDEF, ), - TOKEN_DECLARE("endif", T_MENDIF, ), - TOKEN_DECLARE("else", T_MELSE, ), - TOKEN_DECLARE("link", T_MLINK, ), - TOKEN_DECLARE("if", T_MIF, ), - - { NULL, NULL, 0, 0, 0, 0 }, -}; - - - - diff --git a/src/config/lxrgmr-code/token_id.c b/src/config/lxrgmr-code/token_id.c index fea3a29..89c4e83 100644 --- a/src/config/lxrgmr-code/token_id.c +++ b/src/config/lxrgmr-code/token_id.c @@ -412,10 +412,18 @@ void get_token_word (SRC_FILE_DESC *pfile) int before_ret_proc (SRC_FILE_DESC *psrcfile, TOKEN_PROC_STATE *pstTokenState, int ret) { - int tmp; - /* XXX: write those code in a func. */ - /* XXX: set state */ - /* invoke proc func */ + int tmp = 0; + + /* + * switching to new state, then invoke proc func, + * keeps proc func invoked in the same state. + */ + if (pstTokenState->paired_state) + { + STATE_SWITCH(psrcfile, pstTokenState->paired_state); + printf("switch to strStateName = %s\n", psrcfile->pstCurrTokenState->pstStateInfo->strStateName); + pstTokenState = psrcfile->pstCurrTokenState; + } if (pstTokenState->paired_token != 0 && pstTokenState->paired_token == ret) { @@ -428,8 +436,9 @@ int before_ret_proc (SRC_FILE_DESC *psrcfile, TOKEN_PROC_STATE *pstTokenState, i /* switching back to latest state */ STATE_RECOVERY(psrcfile); + printf("recovery to strStateName = %s\n", psrcfile->pstCurrTokenState->pstStateInfo->strStateName); + psrcfile->pstCurrTokenState->state_token_str = 0; -// printf("recovery to strStateName = %s\n", psrcfile->pstCurrTokenState->pstStateInfo->strStateName); pstTokenState->pfnPairTokenProc = NULL; } else @@ -441,17 +450,11 @@ int before_ret_proc (SRC_FILE_DESC *psrcfile, TOKEN_PROC_STATE *pstTokenState, i psrcfile->iTokenStrLen - psrcfile->iPrevIdx, psrcfile); pstTokenState->pfnTokenProc = NULL; +// printf("token = %d;\n", ret); } if (tmp != 0) ret = tmp; - /* switching to new state */ - if (pstTokenState->paired_state) - { - STATE_SWITCH(psrcfile, pstTokenState->paired_state); - printf("switch to strStateName = %s\n", psrcfile->pstCurrTokenState->pstStateInfo->strStateName); - } - if (str_idx == 0) { @@ -471,6 +474,7 @@ int token_read (SRC_FILE_DESC *psrcfile) // printf("%s: %s()\n", __FILE__, __FUNCTION__); str_idx = 0; + str_buff[0]=0; do { ret = 0; #if 0 @@ -526,7 +530,7 @@ int token_read (SRC_FILE_DESC *psrcfile) * it should be reset to 0 before new analyzing. */ //str_idx = 0; - str_buff[0]=0; + //str_buff[0]=0; if (psrcfile->pstCurrTokenState->state_token_str) { @@ -543,8 +547,8 @@ int token_read (SRC_FILE_DESC *psrcfile) pstTokenState->token_len = strlen(psrcfile->pstCurrTokenState->state_token_str); } - if (ret != 0) - printf("paired token(%d, %d): %s\n", ret, pstTokenState->token_len, psrcfile->pstCurrTokenState->state_token_str); +// if (ret != 0) +// printf("paired token(%d, %d): %s\n", ret, pstTokenState->token_len, psrcfile->pstCurrTokenState->state_token_str); } /* token str proc */ @@ -557,7 +561,7 @@ int token_read (SRC_FILE_DESC *psrcfile) } } -#if 1 +#if 0 printf("iPrevIdx = %d; iTokenStrLen = %d; token_len = %d; recent_token = %d; ret = %d\n", psrcfile->iPrevIdx, psrcfile->iTokenStrLen, @@ -629,9 +633,6 @@ int token_read (SRC_FILE_DESC *psrcfile) continue; } - if (psrcfile->type == TYPE_EOF) - return 0; - /* invoke proc func */ if ((pstTokenState->recent_token == 0 && pstTokenState->pfnTokenProc != NULL) || pstTokenState->pfnPairTokenProc != NULL) @@ -639,9 +640,6 @@ int token_read (SRC_FILE_DESC *psrcfile) tmp = pstTokenState->token_len; pstTokenState = psrcfile->pstCurrTokenState; -// printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n"); -// printf("pstStateInfo->strStateName = %s;\n", pstTokenState->pstStateInfo->strStateName); -// printf("ret = %d;\n", ret); pstTokenState->token_len = tmp; /* @@ -650,8 +648,11 @@ int token_read (SRC_FILE_DESC *psrcfile) */ // str_idx = 0; psrcfile->iPrevIdx += (ret == T_WORD) ? str_idx : pstTokenState->token_len; - if (ret != T_WORD && ret != T_SKIP) - str_idx = 0; +// if (ret != T_WORD && ret != T_SKIP) + { +// printf("############################################ str_idx = 0;\n"); +// str_idx = 0; + } if (ret == T_SKIP) { @@ -904,15 +905,23 @@ TOKEN_PROC_STATE *state_alloc_init (SRC_FILE_DESC *pfiledesc, int iState) pstTokenState->pstStateInfo = pfiledesc->pstStateInfo; pstTokenState->iStateId = iState; + /* duplicate var-info to new state. */ if (pfiledesc->pstCurrTokenState) { pstTokenState->paired_token = pfiledesc->pstCurrTokenState->paired_token; pstTokenState->state_token_str = pfiledesc->pstCurrTokenState->state_token_str; - pstTokenState->pfnPairTokenProc = pfiledesc->pstCurrTokenState->pfnPairTokenProc; - pfiledesc->pstCurrTokenState->pfnPairTokenProc = NULL; + pstTokenState->token_str = pfiledesc->pstCurrTokenState->token_str; pstTokenState->token_len = pfiledesc->pstCurrTokenState->token_len; pfiledesc->pstCurrTokenState->paired_state = 0; + + if (pfiledesc->pstCurrTokenState->pfnPairTokenProc != NULL) + pstTokenState->pfnPairTokenProc = pfiledesc->pstCurrTokenState->pfnPairTokenProc; + pfiledesc->pstCurrTokenState->pfnPairTokenProc = NULL; + + if (pfiledesc->pstCurrTokenState->pfnTokenProc != NULL) + pstTokenState->pfnTokenProc = pfiledesc->pstCurrTokenState->pfnTokenProc; + pfiledesc->pstCurrTokenState->pfnTokenProc = NULL; } return pstTokenState; } diff --git a/src/config/lxrgmr-code/token_id.h b/src/config/lxrgmr-code/token_id.h index 2e85f30..10d9a16 100644 --- a/src/config/lxrgmr-code/token_id.h +++ b/src/config/lxrgmr-code/token_id.h @@ -171,9 +171,11 @@ enum STATE_TOKEN_FLAGS { #define CLR_STATE_FLAG(state, flag) ((state)->u32Flag &= (flag)) #define CHK_STATE_FLAG(state, flag) ((state)->u32Flag & (flag)) +extern void QStackIF_PrintInfo (QSTACK *pstQStack); +extern void QStackIF_PrintBuff (QSTACK *pstQStack); #define STATE_SWITCH(pfile, state) do { \ - QStackIF_PushU32(&(pfile)->stStateStk, (uint32)(pfile)->pstCurrTokenState); \ + QStackIF_Push(&(pfile)->stStateStk, (uint32)(pfile)->pstCurrTokenState); \ (pfile)->pstCurrTokenState = state_alloc_init((pfile), (state)); \ (pfile)->pstCurrTokenState->paired_state = 0; \ } while (false) @@ -187,7 +189,7 @@ enum STATE_TOKEN_FLAGS { #define STATE_RECOVERY(pfile) do { \ free((void *)(pfile)->pstCurrTokenState); \ - (pfile)->pstCurrTokenState = (TOKEN_PROC_STATE *)QStackIF_PopU32(&(pfile)->stStateStk); \ + (pfile)->pstCurrTokenState = (TOKEN_PROC_STATE *)QStackIF_Pop(&(pfile)->stStateStk); \ (pfile)->pstStateInfo = (pfile)->pstCurrTokenState->pstStateInfo; \ } while (false) -- 2.11.4.GIT