@@ -64,8 +64,8 @@ AVSExecMode avsExecMode(const char* str);
6464unsigned char FENCEOptions (const char *str);
6565COMMON_ISA_VME_OP_MODE VMEType (const char *str);
6666Common_VISA_EMask_Ctrl Get_CISA_Emask (const char * str);
67- char *get_kernel_name (const char *str, int str_len);
6867CHANNEL_OUTPUT_FORMAT Get_Channel_Output (const char * str);
68+ static void appendStringLiteralChar (char c, char *buf, size_t *len);
6969
7070static int pendingBracket;
7171
@@ -78,6 +78,7 @@ static int pendingBracket;
7878%option yylineno
7979
8080%x eat_comment
81+ %x string_literal
8182
8283%%
8384
@@ -95,19 +96,91 @@ static int pendingBracket;
9596 return COMMENT_LINE;
9697 }
9798
98- " /*" BEGIN(eat_comment);
99+ " /*" BEGIN(eat_comment);
99100<eat_comment >[^ * ]* /* eat anything that is not a * */
100101<eat_comment >" *" + [^ */ ]* /* eat up '*'s not followed by '/'s */
101102<eat_comment >" *" + " /" BEGIN(INITIAL);
102103
104+
105+ \" {CISAlval.strlit .len = 0 ; CISAlval.strlit .decoded [0 ] = 0 ; BEGIN (string_literal);}
106+ <string_literal >{
107+ \n YY_FATAL_ERROR (" lexical error: newline in string literal" );
108+ <<EOF>> YY_FATAL_ERROR (" lexical error: unterminated string (reached EOF)" );
109+ \\a {appendStringLiteralChar (' \a ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
110+ \\b {appendStringLiteralChar (' \b ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
111+ \\e {appendStringLiteralChar (0x1B ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
112+ \\f {appendStringLiteralChar (' \f ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
113+ \\n {appendStringLiteralChar (' \n ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
114+ \\r {appendStringLiteralChar (' \r ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
115+ \\t {appendStringLiteralChar (' \t ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
116+ \\v {appendStringLiteralChar (' \v ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
117+ \\"'" {appendStringLiteralChar (' \' ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
118+ \\"\"" {appendStringLiteralChar (' \" ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
119+ \\"?" {appendStringLiteralChar (' ?' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
120+ \\\\ {appendStringLiteralChar (' \\ ' ,CISAlval.strlit .decoded ,&CISAlval.strlit .len );}
121+ \\[0-9]{1 ,3 } {
122+ int val = 0 ;
123+ for (int i = 1 ; i < yyleng; i++)
124+ val = 8 *val + yytext[i] - ' 0' ;
125+ appendStringLiteralChar (val,CISAlval.strlit .decoded ,&CISAlval.strlit .len );
126+ }
127+ \\x[0-9A-Fa-f]{1 ,2 } {
128+ int val = 0 ;
129+ for (int i = 2 ; i < yyleng; i++) {
130+ int dig =
131+ yytext[i] >= ' 0' && yytext[i] <= ' 9' ? yytext[i] - ' 0' :
132+ yytext[i] >= ' a' && yytext[i] <= ' f' ? yytext[i] - ' a' + 10 :
133+ yytext[i] - ' A' + 10 ;
134+ val = 16 *val + dig;
135+ }
136+ appendStringLiteralChar (val,CISAlval.strlit .decoded ,&CISAlval.strlit .len );
137+ }
138+ \\. YY_FATAL_ERROR(" lexical error: illegal escape sequence" );
139+ \" {CISAlval.string = strdup (CISAlval.strlit .decoded ); BEGIN (INITIAL); return STRING_LITERAL;}
140+ . {
141+ /* important: this must succeed the exit rule above (\"); lex prefers the first match */
142+ appendStringLiteralChar (yytext[0 ],CISAlval.strlit .decoded ,&CISAlval.strlit .len );
143+ }
144+ }
145+
146+
103147" *" {TRACE (" \n ** TIMES " ); return TIMES;}
104148" +" {TRACE (" \n ** PLUS " ); return PLUS;}
105149" -" {TRACE (" \n ** MINUS " ); return MINUS;}
150+ " =" {TRACE (" \n ** EQUALS " ); return EQUALS;}
151+ " &" {TRACE (" \n ** AMP " ); return AMP;}
152+ " ~" {TRACE (" \n ** TILDE " ); return TILDE;}
153+ " !" {TRACE (" \n ** BANG " ); return BANG;}
154+
155+ " ." {TRACE (" \n ** COLON " ); return DOT;}
156+ " ," {TRACE (" \n ** COMMA " ); return COMMA;}
157+ " ;" {TRACE (" \n ** SEMI " ); return SEMI;}
158+ " :" {TRACE (" \n ** COLON " ); return COLON;}
159+ " /" {TRACE (" \n ** SLASH" ); return SLASH;}
160+
106161" (" {TRACE (" \n ** LPAREN " ); return LPAREN;}
107162" )" {TRACE (" \n ** RPAREN " ); return RPAREN;}
108163" {" {TRACE (" \n ** LBRACE " ); return LBRACE;}
109164" }" {TRACE (" \n ** RBRACE " ); return RBRACE;}
110- " ," {TRACE (" \n ** COMMA " ); return COMMA;}
165+ " <" {TRACE (" \n ** LANGLE " ); return LANGLE;}
166+ " >" {TRACE (" \n ** RANGLE " ); return RANGLE;}
167+ " r[" {
168+ TRACE (" \n ** Register Indirect LEFT bracket" );
169+ CISAlval.string = strdup (yytext);
170+ return IND_LBRACK;
171+ }
172+ " [" {
173+ TRACE (" \n ** LEFT bracket" );
174+ CISAlval.string = strdup (yytext);
175+ return LBRACK;
176+ }
177+
178+ " ]" {
179+ TRACE (" \n ** RIGHT bracket" );
180+ CISAlval.string = strdup (yytext);
181+ return RBRACK;
182+ }
183+
111184
112185" .version" {TRACE (" \n ** VERSION " ); return DIRECTIVE_VERSION;}
113186" .entry" {TRACE (" \n ** ENTRY " ); return DIRECTIVE_ENTRY;}
@@ -122,6 +195,8 @@ static int pendingBracket;
122195" .function" {TRACE (" \n ** FUNCTION " ); return DIRECTIVE_FUNC;}
123196" .global_function" {TRACE (" \n ** GLOBAL FUNCTION " ); return DIRECTIVE_GLOBAL_FUNC;}
124197" .resolvedIndex" {TRACE (" \n ** RESOLVED INDEX " ); return DIRECTIVE_RESOLVED_INDEX;}
198+ " .kernel" {TRACE (" \n ** KERNEL NAME DIRECTIVE " ); return DOT_KERNEL;}
199+ " .function" {TRACE (" \n ** FUNCTION NAME DIRECTIVE " );return DOT_FUNCTION;}
125200
126201" ." implicit[a -zA -Z0 -9_ \- $@? ]* {
127202 TRACE (" \n ** IMPLICIT_INPUT " );
@@ -600,7 +675,6 @@ CM_AVS_(4|8|16)x(4|8) {
600675 return DOUBLEFLOAT;
601676 }
602677
603- qAsmName[ ]* =[ ]* {TRACE (" \n ** File name of assembly " ); CISAlval.string = " AsmName" ; return ASM_NAME;}
604678qSLMSize[ ]* =[ ]* {TRACE (" \n ** File name of assembly " ); CISAlval.string = " SLMSize" ; return SLM_SIZE;}
605679
606680qFlagRegNum[ ]* =[ ]* {TRACE (" \n ** Flag regisetr number " ); CISAlval.string = " FlagRegNum" ; return FLAG_REG_NAME;}
@@ -622,42 +696,6 @@ size[ ]*=[ ]* {TRACE("\n** Size "); return SIZE;}
622696alias[ ]* =[ ]* {TRACE (" \n ** ALIAS " ); return ALIAS;}
623697
624698
625- [a -zA -Z_. ][a -zA -Z0 -9_ \- $ \\ :/. ]* " ." cpp {
626- TRACE (" \n ** CPP File Name " );
627- CISAlval.string = strdup (yytext);
628- return CPP_FILE_NAME;
629- }
630-
631- [a -zA -Z_. ][a -zA -Z0 -9_ \- $ \\ :/. ]* " ." h {
632- TRACE (" \n ** H File Name " );
633- CISAlval.string = strdup (yytext);
634- return H_FILE_NAME;
635- }
636-
637- [a -zA -Z_ ][a -zA -Z0 -9_ \- $ \\ :/. ]* " ." asm {
638- TRACE (" \n ** Assemble File Name " );
639- CISAlval.asm_name = strdup (yytext);
640- return ASM_FILE_NAME;
641- }
642-
643- " cm" {
644- TRACE (" \n ** cm attribute " );
645- CISAlval.asm_name = strdup (yytext);
646- return ATTR_CM;
647- }
648-
649- " 3d" {
650- TRACE (" \n ** 3d attribute " );
651- CISAlval.asm_name = strdup (yytext);
652- return ATTR_3D;
653- }
654-
655- " cs" {
656- TRACE (" \n ** cs attribute " );
657- CISAlval.asm_name = strdup (yytext);
658- return ATTR_CS;
659- }
660-
661699v_type[ ]* =[ ]* F {
662700 TRACE (" \n ** General variable type" );
663701 CISAlval.string = strdup (yytext);
@@ -792,22 +830,6 @@ M1|M2|M3|M4|M5|M6|M7|M8|M1_NM|M2_NM|M3_NM|M4_NM|M5_NM|M6_NM|M7_NM|M8_NM|NoMask {
792830 }
793831
794832
795- " r[" {
796- TRACE (" \n ** Register Indirect LEFT bracket" );
797- CISAlval.string = strdup (yytext);
798- return IND_LEFT_BRACKET;
799- }
800- " [" {
801- TRACE (" \n ** LEFT bracket" );
802- CISAlval.string = strdup (yytext);
803- return LEFT_BRACKET;
804- }
805-
806- " ]" {
807- TRACE (" \n ** RIGHT bracket" );
808- CISAlval.string = strdup (yytext);
809- return RIGHT_BRACKET;
810- }
811833
812834
813835" ." ((R| r)((G| g)? (B| b)? (A| a)? )| (G| g)((B| b)? (A| a)? )| (B| b)((A| a)? )| (A| a)) {
@@ -846,30 +868,21 @@ M1|M2|M3|M4|M5|M6|M7|M8|M1_NM|M2_NM|M3_NM|M4_NM|M5_NM|M6_NM|M7_NM|M8_NM|NoMask {
846868 return PRED_CNTL;
847869 }
848870
849- ^ " ." kernel[ \t ]+ [a -zA -Z ][a -zA -Z0 -9_ \,\- <> ]* [ \t ]* {
850- TRACE (" \n ** KERNEL NAME " );
851- CISAlval.string = get_kernel_name (yytext, yyleng);
852- return K_NAME;
853- }
854871
855872V0 {
856873 TRACE (" \n ** NULL VAR " );
857874 CISAlval.string = strdup (yytext);
858875 return NULL_VAR;
859876 }
860877
861- [a -zA -Z ][a -zA -Z0 -9_ \- ]* {
878+ [a -zA -Z ][a -zA -Z0 -9_ ]* {
862879 TRACE (" \n ** VAR " );
863880 CISAlval.string = strdup (yytext);
864881 return VAR;
865882 }
866883
867884
868- [a -zA -Z_$@ \? ][a -zA -Z0 -9_ \- $@ \? ]* {
869- TRACE (" \n ** FUNCTION NAME " );
870- CISAlval.string = strdup (yytext);
871- return F_NAME;
872- }
885+
873886
874887
875888[^ \t\n ] {TRACE (" \n ** SPACE END" ); return *yytext;}
@@ -1150,3 +1163,12 @@ CHANNEL_OUTPUT_FORMAT Get_Channel_Output(const char* str)
11501163 YY_FATAL_ERROR (str);
11511164 return CHANNEL_16_BIT_FULL;
11521165}
1166+
1167+ static void appendStringLiteralChar (char c, char *buf, size_t *len)
1168+ {
1169+ if (*len == sizeof (CISAlval.strlit )) {
1170+ YY_FATAL_ERROR (" string literal too long" );
1171+ }
1172+ buf[(*len)++] = c;
1173+ buf[*len] = 0 ;
1174+ }
0 commit comments