1/* 2 * Copyright (c) 2013 Rob Clark <robclark@freedesktop.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 */ 23 24%{ 25#include <stdlib.h> 26#include "util/ralloc.h" 27#include "ir3/ir3.h" 28#include "ir3_parser.h" 29 30#define YY_NO_INPUT 31#define YY_NO_UNPUT 32#define TOKEN(t) (ir3_yylval.tok = t) 33extern YYSTYPE ir3_yylval; 34extern void *ir3_parser_dead_ctx; 35 36void ir3_yyset_input(FILE *f); 37 38void ir3_yyset_input(FILE *f) 39{ 40 YY_FLUSH_BUFFER; 41 ir3_yyin = f; 42} 43 44static int parse_wrmask(const char *src) 45{ 46 int i, num = 0; 47 for (i = 0; i < 4; i++) { 48 if ("xyzw"[i] == src[1]) { 49 num |= (1 << i); 50 src++; 51 } 52 } 53 return num; 54} 55 56static int parse_reg(const char *str) 57{ 58 int num = 0; 59 if (str[0] == 'h') { 60 str++; 61 num++; 62 } 63 str++; 64 num += strtol(str, (char **)&str, 10) << 3; 65 switch (str[1]) { 66 case 'x': num += 0; break; 67 case 'y': num += 2; break; 68 case 'z': num += 4; break; 69 case 'w': num += 6; break; 70 default: assert(0); break; 71 } 72 return num; 73} 74 75%} 76 77%option noyywrap 78%option prefix="ir3_yy" 79 80%% 81"\n" yylineno++; 82[ \t] ; /* ignore whitespace */ 83";"[^\n]*"\n" yylineno++; /* ignore comments */ 84"(0.0)" ir3_yylval.num = 0; return T_FLUT_0_0; 85"(0.5)" ir3_yylval.num = 1; return T_FLUT_0_5; 86"(1.0)" ir3_yylval.num = 2; return T_FLUT_1_0; 87"(2.0)" ir3_yylval.num = 3; return T_FLUT_2_0; 88"(e)" ir3_yylval.num = 4; return T_FLUT_E; 89"(pi)" ir3_yylval.num = 5; return T_FLUT_PI; 90"(1/pi)" ir3_yylval.num = 6; return T_FLUT_INV_PI; 91"(1/log2(e))" ir3_yylval.num = 7; return T_FLUT_INV_LOG2_E; 92"(log2(e))" ir3_yylval.num = 8; return T_FLUT_LOG2_E; 93"(1/log2(10))" ir3_yylval.num = 9; return T_FLUT_INV_LOG2_10; 94"(log2(10))" ir3_yylval.num = 10; return T_FLUT_LOG2_10; 95"(4.0)" ir3_yylval.num = 11; return T_FLUT_4_0; 96[0-9]+"."[0-9]+ ir3_yylval.flt = strtod(yytext, NULL); return T_FLOAT; 97[0-9]* ir3_yylval.num = strtoul(yytext, NULL, 0); return T_INT; 98"0x"[0-9a-fA-F]* ir3_yylval.num = strtoul(yytext, NULL, 0); return T_HEX; 99"@localsize" return TOKEN(T_A_LOCALSIZE); 100"@const" return TOKEN(T_A_CONST); 101"@buf" return TOKEN(T_A_BUF); 102"@invocationid" return TOKEN(T_A_INVOCATIONID); 103"@wgid" return TOKEN(T_A_WGID); 104"@numwg" return TOKEN(T_A_NUMWG); 105"@branchstack" return TOKEN(T_A_BRANCHSTACK); 106"@in" return TOKEN(T_A_IN); 107"@out" return TOKEN(T_A_OUT); 108"@tex" return TOKEN(T_A_TEX); 109"@pvtmem" return TOKEN(T_A_PVTMEM); 110"@earlypreamble" return TOKEN(T_A_EARLYPREAMBLE); 111"(sy)" return TOKEN(T_SY); 112"(ss)" return TOKEN(T_SS); 113"(absneg)" return TOKEN(T_ABSNEG); 114"(neg)" return TOKEN(T_NEG); 115"(abs)" return TOKEN(T_ABS); 116"(r)" return TOKEN(T_R); 117"(ul)" return TOKEN(T_UL); 118"(even)" return TOKEN(T_EVEN); 119"(pos_infinity)" return TOKEN(T_POS_INFINITY); 120"(neg_infinity)" return TOKEN(T_NEG_INFINITY); 121"(ei)" return TOKEN(T_EI); 122"(jp)" return TOKEN(T_JP); 123"(sat)" return TOKEN(T_SAT); 124"(rpt"[0-7]")" ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_RPT; 125"(nop"[0-7]")" ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_NOP; 126"("[x]?[y]?[z]?[w]?")" ir3_yylval.num = parse_wrmask(yytext); return T_WRMASK; 127 128[h]?"r"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_REGISTER; 129[h]?"c"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_CONSTANT; 130"a0.x" return T_A0; 131"a1.x" return T_A1; 132"p0."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_P0; 133"w"[0-9]+ ir3_yylval.num = strtol(yytext+1, NULL, 10); return T_W; 134"s#"[0-9]+ ir3_yylval.num = strtol(yytext+2, NULL, 10); return T_SAMP; 135"t#"[0-9]+ ir3_yylval.num = strtol(yytext+2, NULL, 10); return T_TEX; 136 137 /* category 0: */ 138"nop" return TOKEN(T_OP_NOP); 139"br" return TOKEN(T_OP_BR); 140"brao" return TOKEN(T_OP_BRAO); 141"braa" return TOKEN(T_OP_BRAA); 142"brac" return TOKEN(T_OP_BRAC); 143"bany" return TOKEN(T_OP_BANY); 144"ball" return TOKEN(T_OP_BALL); 145"brax" return TOKEN(T_OP_BRAX); 146"jump" return TOKEN(T_OP_JUMP); 147"call" return TOKEN(T_OP_CALL); 148"ret" return TOKEN(T_OP_RET); 149"kill" return TOKEN(T_OP_KILL); 150"end" return TOKEN(T_OP_END); 151"emit" return TOKEN(T_OP_EMIT); 152"cut" return TOKEN(T_OP_CUT); 153"chmask" return TOKEN(T_OP_CHMASK); 154"chsh" return TOKEN(T_OP_CHSH); 155"flow_rev" return TOKEN(T_OP_FLOW_REV); 156"bkt" return TOKEN(T_OP_BKT); 157"stks" return TOKEN(T_OP_STKS); 158"stkr" return TOKEN(T_OP_STKR); 159"xset" return TOKEN(T_OP_XSET); 160"xclr" return TOKEN(T_OP_XCLR); 161"getlast" return TOKEN(T_OP_GETLAST); 162"getone" return TOKEN(T_OP_GETONE); 163"dbg" return TOKEN(T_OP_DBG); 164"shps" return TOKEN(T_OP_SHPS); 165"shpe" return TOKEN(T_OP_SHPE); 166"predt" return TOKEN(T_OP_PREDT); 167"predf" return TOKEN(T_OP_PREDF); 168"prede" return TOKEN(T_OP_PREDE); 169 170 /* category 1: */ 171"movmsk" return TOKEN(T_OP_MOVMSK); 172"mova1" return TOKEN(T_OP_MOVA1); 173"mova" return TOKEN(T_OP_MOVA); 174"mov" return TOKEN(T_OP_MOV); 175"cov" return TOKEN(T_OP_COV); 176"swz" return TOKEN(T_OP_SWZ); 177"gat" return TOKEN(T_OP_GAT); 178"sct" return TOKEN(T_OP_SCT); 179 180("f16"|"f32"|"u16"|"u32"|"s16"|"s32"|"u8"|"s8"){2} ir3_yylval.str = yytext; return T_CAT1_TYPE_TYPE; 181 182 /* category 2: */ 183"add.f" return TOKEN(T_OP_ADD_F); 184"min.f" return TOKEN(T_OP_MIN_F); 185"max.f" return TOKEN(T_OP_MAX_F); 186"mul.f" return TOKEN(T_OP_MUL_F); 187"sign.f" return TOKEN(T_OP_SIGN_F); 188"cmps.f" return TOKEN(T_OP_CMPS_F); 189"absneg.f" return TOKEN(T_OP_ABSNEG_F); 190"cmpv.f" return TOKEN(T_OP_CMPV_F); 191"floor.f" return TOKEN(T_OP_FLOOR_F); 192"ceil.f" return TOKEN(T_OP_CEIL_F); 193"rndne.f" return TOKEN(T_OP_RNDNE_F); 194"rndaz.f" return TOKEN(T_OP_RNDAZ_F); 195"trunc.f" return TOKEN(T_OP_TRUNC_F); 196"add.u" return TOKEN(T_OP_ADD_U); 197"add.s" return TOKEN(T_OP_ADD_S); 198"sub.u" return TOKEN(T_OP_SUB_U); 199"sub.s" return TOKEN(T_OP_SUB_S); 200"cmps.u" return TOKEN(T_OP_CMPS_U); 201"cmps.s" return TOKEN(T_OP_CMPS_S); 202"min.u" return TOKEN(T_OP_MIN_U); 203"min.s" return TOKEN(T_OP_MIN_S); 204"max.u" return TOKEN(T_OP_MAX_U); 205"max.s" return TOKEN(T_OP_MAX_S); 206"absneg.s" return TOKEN(T_OP_ABSNEG_S); 207"and.b" return TOKEN(T_OP_AND_B); 208"or.b" return TOKEN(T_OP_OR_B); 209"not.b" return TOKEN(T_OP_NOT_B); 210"xor.b" return TOKEN(T_OP_XOR_B); 211"cmpv.u" return TOKEN(T_OP_CMPV_U); 212"cmpv.s" return TOKEN(T_OP_CMPV_S); 213"mul.u24" return TOKEN(T_OP_MUL_U24); 214"mul.s24" return TOKEN(T_OP_MUL_S24); 215"mull.u" return TOKEN(T_OP_MULL_U); 216"bfrev.b" return TOKEN(T_OP_BFREV_B); 217"clz.s" return TOKEN(T_OP_CLZ_S); 218"clz.b" return TOKEN(T_OP_CLZ_B); 219"shl.b" return TOKEN(T_OP_SHL_B); 220"shr.b" return TOKEN(T_OP_SHR_B); 221"ashr.b" return TOKEN(T_OP_ASHR_B); 222"bary.f" return TOKEN(T_OP_BARY_F); 223"flat.b" return TOKEN(T_OP_FLAT_B); 224"mgen.b" return TOKEN(T_OP_MGEN_B); 225"getbit.b" return TOKEN(T_OP_GETBIT_B); 226"setrm" return TOKEN(T_OP_SETRM); 227"cbits.b" return TOKEN(T_OP_CBITS_B); 228"shb" return TOKEN(T_OP_SHB); 229"msad" return TOKEN(T_OP_MSAD); 230 231 /* category 3: */ 232"mad.u16" return TOKEN(T_OP_MAD_U16); 233"madsh.u16" return TOKEN(T_OP_MADSH_U16); 234"mad.s16" return TOKEN(T_OP_MAD_S16); 235"madsh.m16" return TOKEN(T_OP_MADSH_M16); 236"mad.u24" return TOKEN(T_OP_MAD_U24); 237"mad.s24" return TOKEN(T_OP_MAD_S24); 238"mad.f16" return TOKEN(T_OP_MAD_F16); 239"mad.f32" return TOKEN(T_OP_MAD_F32); 240"sel.b16" return TOKEN(T_OP_SEL_B16); 241"sel.b32" return TOKEN(T_OP_SEL_B32); 242"sel.s16" return TOKEN(T_OP_SEL_S16); 243"sel.s32" return TOKEN(T_OP_SEL_S32); 244"sel.f16" return TOKEN(T_OP_SEL_F16); 245"sel.f32" return TOKEN(T_OP_SEL_F32); 246"sad.s16" return TOKEN(T_OP_SAD_S16); 247"sad.s32" return TOKEN(T_OP_SAD_S32); 248"shrm" return TOKEN(T_OP_SHRM); 249"shlm" return TOKEN(T_OP_SHLM); 250"shrg" return TOKEN(T_OP_SHRG); 251"shlg" return TOKEN(T_OP_SHLG); 252"andg" return TOKEN(T_OP_ANDG); 253"dp2acc" return TOKEN(T_OP_DP2ACC); 254"dp4acc" return TOKEN(T_OP_DP4ACC); 255"wmm" return TOKEN(T_OP_WMM); 256"wmm.accu" return TOKEN(T_OP_WMM_ACCU); 257 258 /* category 4: */ 259"rcp" return TOKEN(T_OP_RCP); 260"rsq" return TOKEN(T_OP_RSQ); 261"log2" return TOKEN(T_OP_LOG2); 262"exp2" return TOKEN(T_OP_EXP2); 263"sin" return TOKEN(T_OP_SIN); 264"cos" return TOKEN(T_OP_COS); 265"sqrt" return TOKEN(T_OP_SQRT); 266"hrsq" return TOKEN(T_OP_HRSQ); 267"hlog2" return TOKEN(T_OP_HLOG2); 268"hexp2" return TOKEN(T_OP_HEXP2); 269 270 /* category 5: */ 271"isam" return TOKEN(T_OP_ISAM); 272"isaml" return TOKEN(T_OP_ISAML); 273"isamm" return TOKEN(T_OP_ISAMM); 274"sam" return TOKEN(T_OP_SAM); 275"samb" return TOKEN(T_OP_SAMB); 276"saml" return TOKEN(T_OP_SAML); 277"samgq" return TOKEN(T_OP_SAMGQ); 278"getlod" return TOKEN(T_OP_GETLOD); 279"conv" return TOKEN(T_OP_CONV); 280"convm" return TOKEN(T_OP_CONVM); 281"getsize" return TOKEN(T_OP_GETSIZE); 282"getbuf" return TOKEN(T_OP_GETBUF); 283"getpos" return TOKEN(T_OP_GETPOS); 284"getinfo" return TOKEN(T_OP_GETINFO); 285"dsx" return TOKEN(T_OP_DSX); 286"dsy" return TOKEN(T_OP_DSY); 287"gather4r" return TOKEN(T_OP_GATHER4R); 288"gather4g" return TOKEN(T_OP_GATHER4G); 289"gather4b" return TOKEN(T_OP_GATHER4B); 290"gather4a" return TOKEN(T_OP_GATHER4A); 291"samgp0" return TOKEN(T_OP_SAMGP0); 292"samgp1" return TOKEN(T_OP_SAMGP1); 293"samgp2" return TOKEN(T_OP_SAMGP2); 294"samgp3" return TOKEN(T_OP_SAMGP3); 295"dsxpp.1" return TOKEN(T_OP_DSXPP_1); 296"dsypp.1" return TOKEN(T_OP_DSYPP_1); 297"rgetpos" return TOKEN(T_OP_RGETPOS); 298"rgetinfo" return TOKEN(T_OP_RGETINFO); 299"brcst.active" return TOKEN(T_OP_BRCST_A); 300"quad_shuffle.brcst" return TOKEN(T_OP_QSHUFFLE_BRCST); 301"quad_shuffle.horiz" return TOKEN(T_OP_QSHUFFLE_H); 302"quad_shuffle.vert" return TOKEN(T_OP_QSHUFFLE_V); 303"quad_shuffle.diag" return TOKEN(T_OP_QSHUFFLE_DIAG); 304 305 /* category 6: */ 306"ldg" return TOKEN(T_OP_LDG); 307"ldg.a" return TOKEN(T_OP_LDG_A); 308"ldl" return TOKEN(T_OP_LDL); 309"ldp" return TOKEN(T_OP_LDP); 310"stg" return TOKEN(T_OP_STG); 311"stg.a" return TOKEN(T_OP_STG_A); 312"stl" return TOKEN(T_OP_STL); 313"stp" return TOKEN(T_OP_STP); 314"ldib" return TOKEN(T_OP_LDIB); 315"g2l" return TOKEN(T_OP_G2L); 316"l2g" return TOKEN(T_OP_L2G); 317"prefetch" return TOKEN(T_OP_PREFETCH); 318"ldlw" return TOKEN(T_OP_LDLW); 319"stlw" return TOKEN(T_OP_STLW); 320"resfmt" return TOKEN(T_OP_RESFMT); 321"resinfo" return TOKEN(T_OP_RESINFO); 322"atomic.add" return TOKEN(T_OP_ATOMIC_ADD); 323"atomic.sub" return TOKEN(T_OP_ATOMIC_SUB); 324"atomic.xchg" return TOKEN(T_OP_ATOMIC_XCHG); 325"atomic.inc" return TOKEN(T_OP_ATOMIC_INC); 326"atomic.dec" return TOKEN(T_OP_ATOMIC_DEC); 327"atomic.cmpxchg" return TOKEN(T_OP_ATOMIC_CMPXCHG); 328"atomic.min" return TOKEN(T_OP_ATOMIC_MIN); 329"atomic.max" return TOKEN(T_OP_ATOMIC_MAX); 330"atomic.and" return TOKEN(T_OP_ATOMIC_AND); 331"atomic.or" return TOKEN(T_OP_ATOMIC_OR); 332"atomic.xor" return TOKEN(T_OP_ATOMIC_XOR); 333"resinfo.b" return TOKEN(T_OP_RESINFO_B); 334"ldib.b" return TOKEN(T_OP_LDIB_B); 335"stib.b" return TOKEN(T_OP_STIB_B); 336"atomic.b.add" return TOKEN(T_OP_ATOMIC_B_ADD); 337"atomic.b.sub" return TOKEN(T_OP_ATOMIC_B_SUB); 338"atomic.b.xchg" return TOKEN(T_OP_ATOMIC_B_XCHG); 339"atomic.b.inc" return TOKEN(T_OP_ATOMIC_B_INC); 340"atomic.b.dec" return TOKEN(T_OP_ATOMIC_B_DEC); 341"atomic.b.cmpxchg" return TOKEN(T_OP_ATOMIC_B_CMPXCHG); 342"atomic.b.min" return TOKEN(T_OP_ATOMIC_B_MIN); 343"atomic.b.max" return TOKEN(T_OP_ATOMIC_B_MAX); 344"atomic.b.and" return TOKEN(T_OP_ATOMIC_B_AND); 345"atomic.b.or" return TOKEN(T_OP_ATOMIC_B_OR); 346"atomic.b.xor" return TOKEN(T_OP_ATOMIC_B_XOR); 347"atomic.s.add" return TOKEN(T_OP_ATOMIC_S_ADD); 348"atomic.s.sub" return TOKEN(T_OP_ATOMIC_S_SUB); 349"atomic.s.xchg" return TOKEN(T_OP_ATOMIC_S_XCHG); 350"atomic.s.inc" return TOKEN(T_OP_ATOMIC_S_INC); 351"atomic.s.dec" return TOKEN(T_OP_ATOMIC_S_DEC); 352"atomic.s.cmpxchg" return TOKEN(T_OP_ATOMIC_S_CMPXCHG); 353"atomic.s.min" return TOKEN(T_OP_ATOMIC_S_MIN); 354"atomic.s.max" return TOKEN(T_OP_ATOMIC_S_MAX); 355"atomic.s.and" return TOKEN(T_OP_ATOMIC_S_AND); 356"atomic.s.or" return TOKEN(T_OP_ATOMIC_S_OR); 357"atomic.s.xor" return TOKEN(T_OP_ATOMIC_S_XOR); 358"atomic.g.add" return TOKEN(T_OP_ATOMIC_G_ADD); 359"atomic.g.sub" return TOKEN(T_OP_ATOMIC_G_SUB); 360"atomic.g.xchg" return TOKEN(T_OP_ATOMIC_G_XCHG); 361"atomic.g.inc" return TOKEN(T_OP_ATOMIC_G_INC); 362"atomic.g.dec" return TOKEN(T_OP_ATOMIC_G_DEC); 363"atomic.g.cmpxchg" return TOKEN(T_OP_ATOMIC_G_CMPXCHG); 364"atomic.g.min" return TOKEN(T_OP_ATOMIC_G_MIN); 365"atomic.g.max" return TOKEN(T_OP_ATOMIC_G_MAX); 366"atomic.g.and" return TOKEN(T_OP_ATOMIC_G_AND); 367"atomic.g.or" return TOKEN(T_OP_ATOMIC_G_OR); 368"atomic.g.xor" return TOKEN(T_OP_ATOMIC_G_XOR); 369 370"ldgb" return TOKEN(T_OP_LDGB); 371"stgb" return TOKEN(T_OP_STGB); 372"stib" return TOKEN(T_OP_STIB); 373"ldc" return TOKEN(T_OP_LDC); 374"ldlv" return TOKEN(T_OP_LDLV); 375"getspid" return TOKEN(T_OP_GETSPID); 376"getwid" return TOKEN(T_OP_GETWID); 377"getfiberid" return TOKEN(T_OP_GETFIBERID); 378"stc" return TOKEN(T_OP_STC); 379 380 /* category 7: */ 381"bar" return TOKEN(T_OP_BAR); 382"fence" return TOKEN(T_OP_FENCE); 383 384"f16" return TOKEN(T_TYPE_F16); 385"f32" return TOKEN(T_TYPE_F32); 386"u16" return TOKEN(T_TYPE_U16); 387"u32" return TOKEN(T_TYPE_U32); 388"s16" return TOKEN(T_TYPE_S16); 389"s32" return TOKEN(T_TYPE_S32); 390"u8" return TOKEN(T_TYPE_U8); 391"s8" return TOKEN(T_TYPE_S8); 392 393"untyped" return TOKEN(T_UNTYPED); 394"typed" return TOKEN(T_TYPED); 395 396"unsigned" return TOKEN(T_UNSIGNED); 397"mixed" return TOKEN(T_MIXED); 398"low" return TOKEN(T_LOW); 399"high" return TOKEN(T_HIGH); 400 401"1d" return TOKEN(T_1D); 402"2d" return TOKEN(T_2D); 403"3d" return TOKEN(T_3D); 404"4d" return TOKEN(T_4D); 405 406"lt" return TOKEN(T_LT); 407"le" return TOKEN(T_LE); 408"gt" return TOKEN(T_GT); 409"ge" return TOKEN(T_GE); 410"eq" return TOKEN(T_EQ); 411"ne" return TOKEN(T_NE); 412 413"a" return 'a'; 414"o" return 'o'; 415"p" return 'p'; 416"s2en" return TOKEN(T_S2EN); 417"s" return 's'; 418"k" return 'k'; 419"base"[0-9]+ ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_BASE; 420"offset"[0-9]+ ir3_yylval.num = strtol(yytext+6, NULL, 10); return T_OFFSET; 421"uniform" return T_UNIFORM; 422"nonuniform" return T_NONUNIFORM; 423"imm" return T_IMM; 424 425"h" return 'h'; 426"=" return '='; 427"(" return '('; 428")" return ')'; 429"[" return '['; 430"]" return ']'; 431"," return ','; 432"." return '.'; 433"-" return '-'; 434"+" return '+'; 435"|" return '|'; 436"c" return 'c'; 437"r" return 'r'; 438"hc" return TOKEN(T_HC); 439"hr" return TOKEN(T_HR); 440"g" return 'g'; 441"w" return 'w'; 442"l" return 'l'; 443"<" return '<'; 444">" return '>'; 445"!" return '!'; 446"#" return '#'; 447":" return ':'; 448 449"nan" return TOKEN(T_NAN); 450"inf" return TOKEN(T_INF); 451 452[a-zA-Z_][a-zA-Z_0-9]* ir3_yylval.str = ralloc_strdup(ir3_parser_dead_ctx, yytext); return T_IDENTIFIER; 453. fprintf(stderr, "error at line %d: Unknown token: %s\n", ir3_yyget_lineno(), yytext); yyterminate(); 454%% 455