7 #include "../lib/AQStack.h"
8 #include "../lib/util.h"
10 #include "../gmr/parser.tab.h"
12 //extern YYSTYPE yylval;
14 extern int config_yylex();
15 extern int yylex(void);
16 extern void strtoken_init(void);
19 * last token stores returned token value.
20 * it was setted with 0 if [[:blank:]] detected.
22 * @ string join. stick string and word out of yylex() by judging var of last_token.
23 * @ c89 style comment '\/\*' processing.
27 int dual_token_flag
= 0;
32 if (ret == T_EOL && last_token == -1)
34 printf("ignore T_EOL at the beginning of file.\n");
37 else if (ret == T_EOL && (last_token == T_WORD || last_token == T_WORD_QUOTE))
39 // printf("T_EOL.\n");
44 else if (ret == T_EOL && prev_token == T_EOL)
46 // printf("T_EOL again.\n");
49 else if (ret == T_EOL && prev_token != T_EOL)
55 else if (ret != T_EOL && prev_token == T_EOL)
57 // printf("end of T_EOL\n");
59 // dual_token_flag = 1;
64 enum __tag_STATE_TYPE
{
83 {T_ASSIGN
, T_SEMI
, EM_EXPR
},
84 {T_ENVASSIGN
, T_SEMI
, EM_EXPR
},
85 {T_LBRACKET1
, T_RBRACKET1
, EM_EXPR
},
86 {T_DLBRACKET1
, T_DRBRACKET1
, EM_EXPR
},
88 {T_DOLLAR
, T_RBRACKET3
, EM_ENVAR
},
90 {T_CMNT_BEGIN
, T_CMNT
, EM_CMNT
},
92 {T_MDEFINE
, T_NL
, EM_MACRO
},
93 {T_MIF
, T_NL
, EM_MACRO
},
94 {T_MIFDEF
, T_NL
, EM_MACRO
},
95 {T_MIFNDEF
, T_NL
, EM_MACRO
},
96 {T_MELSE
, T_NL
, EM_MACRO
},
97 {T_MENDIF
, T_NL
, EM_MACRO
},
98 {T_MINCLUDE
, T_NL
, EM_MACRO
},
99 {T_MPRAGMA
, T_NL
, EM_MACRO
},
101 {T_WORD
, T_ASSIGN
, EM_ASSIGN
},
102 {T_WORD
, T_ADDASSIGN
, EM_ASSIGN
},
103 {T_WORD
, T_LBRACKET2
, EM_ASSIGN
},
105 {T_WORD
, 0, EM_WORD
},
107 {T_WORD_QUOTE
, 0, EM_STRING
},
111 {T_BLANK
, 0, EM_BLANK
},
116 * expr: T_ASSIGN/T_ENVASSIGN and T_SEMI,
117 * T_LBRACKET2 and T_RBRACKET2,
118 * T_LBRACKET1 AND T_RBRACKET1.
119 * T_DLBRACKET1 AND T_DRBRACKET1.
120 * envar: T_DOLLAR and T_RBRACKET3.
121 * word: T_WORD and T_WORD and T_CONST.
122 * string: T_WORD_QUOTE and T_WORD_QUOTE.
123 * init-nl: T_EOL, filter.
124 * multi-nl: T_EOL and T_EOL, filter.
125 * blank: T_BLANK and T_BLANK, filter.
126 * comment: T_CMNT_BEGIN and T_CMNT.
128 uint32
TokenProc (int token
)
132 if (state
== EM_EXPR
)
134 else if (state
== EM_ENVAR
)
136 else if (state
== EM_CMNT
)
138 else if (state
== EM_WORD
)
140 else if (state
== EM_STRING
)
142 else if (state
== EM_NL
)
144 else if (state
== EM_BLANK
)
150 int on_token_proc (int ret
)
152 // extern char str_buff[8192];
153 // extern int str_idx;
154 extern PARSER_DESC
*gparser
;
157 TOKEN_PROC_STATE
*pstTokenState
= gparser
->pstCurrTokenState
;
158 const char *str
= NULL
;
161 * display token id, token name, and it's content.
163 str
= name_look_up_token(ret
);
166 printf("<%d> %s: ", ret
, str
);
167 if (!strcmp(str
, "T_EOL"))
172 else if (!strcmp(str
, "T_HELPTEXT"))
174 else if (!strcmp(str
, "T_WORD_QUOTE"))
176 else if (!strcmp(str
, "T_C89_CMNT"))
180 if (is_empty_string(&strbuff
))
181 pstr
= pstTokenState
->token_str
;
185 // printf("str_idx = %d\n", str_idx);
186 // printf("pstr = %d\n", pstr);
187 printf("%s\n", pstr
);
192 if (yylval.id->token == ret)
193 printf("%s\n", yylval.id->name);
195 printf("%s\n", yylval.string);
200 // TBD: append gmr parser func here.
207 * @ string/word combine
209 * @ first nl in file ignore.
213 int yylex_token_proc (PARSER_DESC
*file
)
219 // fprintf(stderr, "yylex_proc()\n");
224 if (!QStackIF_IsEmpty(&file
->stTokenQ
))
226 token
= (int)QStackIF_DeQueue(&file
->stTokenQ
);
227 pdata
= (void *)QStackIF_DeQueue(&file
->stTokenQ
);
229 // printf("token(%d, %d, %d)\n", ret, prev_token, last_token);
231 // if (last_token == T_EOL && (prev_token == 0 || prev_token == T_EOL))
233 // prev_token = last_token;
237 on_token_proc(token
);
240 * do buffer release work here, and does not need to invoke free(yylval.string);
241 * in grammer proc func.
243 if (!is_unallocated_string(&strbuff
) || yylval
.string
)
245 // printf("free_string()\n");
246 free_string(&strbuff
);
252 /* new token parsing */
253 yylval
.string
= NULL
;
255 //if (!(ret = token_read(gparser)))
256 if (!(ret
= yylex()))
258 // fprintf(stderr, "b break(%d)\n", ret);
261 // printf("yylex(%d, %d, %d)\n", ret, prev_token, last_token);
263 ret
= TokenProc(ret
);
273 // fprintf(stderr, "e return (%d)\n", 0);
277 int yylex_proc (void)
279 extern PARSER_DESC
*gparser
;
281 yylex_token_proc(gparser
);
284 void lxrgmr_init (void)
289 init_strbuff(&strbuff
);
291 yylval
.string
= NULL
;