1 /**** MSG_LICENCE DO NOT REMOVE ****/
5 #include"gs/gs_private.h"
6 #include"gs/parse.yy.h"
8 YY_BUFFER_STATE input_buffer;
11 int gs_parse_line_pos = 1;
12 int gs_parse_char_pos = 0;
13 int gs_parse_tok_num = 0;
24 char string_buf[GS_PARSE_MAX_STR_CONST];
25 char *string_buf_ptr = NULL;
29 comment_caller = INITIAL;
38 <comment>[^*\n]* /* eat anything that's not a '*' */
39 <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
40 <comment>\n {++gs_parse_line_pos;gs_parse_char_pos=0;}
41 <comment>"*"+"/" BEGIN(comment_caller);
43 \" string_buf_ptr = string_buf; gs_parse_char_pos++; BEGIN(str);
45 <str>\" { /* saw closing quote - all done */
47 *string_buf_ptr = '\0';
50 return GS_PARSE_TOKEN_WORD;
51 /* return string constant token type and
57 /* error - unterminated string constant */
58 /* generate error message */
62 /* octal escape sequence */
65 (void) sscanf( yytext + 1, "%o", &result );
68 /* error, constant is out-of-bounds */
70 *string_buf_ptr++ = result;
75 /* generate error - bad escape sequence; something
76 * like '\48' or '\0777777'
80 <str>\\n {*string_buf_ptr++ = '\n'; gs_parse_char_pos++;}
81 <str>\\t {*string_buf_ptr++ = '\t'; gs_parse_char_pos++;}
82 <str>\\r {*string_buf_ptr++ = '\r'; gs_parse_char_pos++;}
83 <str>\\b {*string_buf_ptr++ = '\b'; gs_parse_char_pos++;}
84 <str>\\f {*string_buf_ptr++ = '\f'; gs_parse_char_pos++;}
86 <str>\\(.|\n) {*string_buf_ptr++ = yytext[1];
88 ++gs_parse_line_pos;gs_parse_char_pos=0;
89 } else { gs_parse_char_pos++;}
96 *string_buf_ptr++ = *yptr++;
100 ({letter}|{digit})* { gs_parse_char_pos+= strlen(yytext); return(GS_PARSE_TOKEN_WORD);}
101 "{" { gs_parse_char_pos++; return(GS_PARSE_TOKEN_LP);}
102 "}" { gs_parse_char_pos++;return(GS_PARSE_TOKEN_RP);}
103 "*" { gs_parse_char_pos++;return(GS_PARSE_TOKEN_STAR);}
104 ";" { gs_parse_char_pos++;return(GS_PARSE_TOKEN_SEMI_COLON);}
105 "," { gs_parse_char_pos++;return(GS_PARSE_TOKEN_COLON);}
106 "\n" { gs_parse_line_pos++; gs_parse_char_pos=0;}
107 . { gs_parse_char_pos++;}
109 /* {space}+ { return(TOKEN_SPACE);} */
111 void gs_parse_dump(void) {
112 switch(gs_parse_tok_num) {
113 case GS_PARSE_TOKEN_LP : {printf("TOKEN_LP ");break;}
114 case GS_PARSE_TOKEN_RP : {printf("TOKEN_RP ");break;}
115 case GS_PARSE_TOKEN_WORD : {printf("TOKEN_WORD ");break;}
116 // case GS_PARSE_TOKEN_SPACE : {printf("TOKEN_SPACE ");break;}
117 // case GS_PARSE_TOKEN_COMMENT : {printf("TOKEN_COMMENT ");break;}
118 case GS_PARSE_TOKEN_NEWLINE : {printf("TOKEN_NEWLINE\n");return;}
119 case GS_PARSE_TOKEN_EMPTY : {printf("TOKEN_EMPTY\n");return;}
120 default : {printf("Unknown token %d\n", gs_parse_tok_num);return;}
122 printf("-->%s<-- [line %d, pos %d]\n",yytext,gs_parse_line_pos,gs_parse_char_pos);
126 int gs_parse_lex_n_dump(void) {
127 gs_parse_tok_num = gs_parse_lex();
129 // gs_parse_char_pos += strlen(yytext);
130 return(gs_parse_tok_num);
133 void gs_parse_pointer_init(const char *file) {
134 file_to_parse = fopen(file,"r");
135 input_buffer = yy_create_buffer( file_to_parse, 10 );
136 yy_switch_to_buffer(input_buffer);
138 gs_parse_line_pos = 1;
139 gs_parse_char_pos = 0;
140 gs_parse_tok_num = 0;
143 void gs_parse_pointer_close(void) {
144 yy_delete_buffer(input_buffer);
145 fclose(file_to_parse);
147 gs_parse_line_pos = 1;
148 gs_parse_char_pos = 0;
149 gs_parse_tok_num = 0;
153 void gs_parse_pointer_string_init(const char *string_to_parse) {
154 input_buffer = yy_scan_string (string_to_parse);
155 yy_switch_to_buffer(input_buffer);
157 gs_parse_line_pos = 1;
158 gs_parse_char_pos = 0;
159 gs_parse_tok_num = 0;
162 void gs_parse_pointer_string_close(void) {
163 yy_delete_buffer(input_buffer);
165 gs_parse_line_pos = 1;
166 gs_parse_char_pos = 0;
167 gs_parse_tok_num = 0;