3 * @brief RPC tools--Defining lexical analysis rules for API definition files
7 * Defining Lexical Analysis Rules for Use with RPC Tools (apidef)
12 #include "apidef.tab.h"
16 ALPHANUM [0-9\-A-Za-z_]
17 ALPHANUMDOT [0-9.\-A-Za-z_/]
24 INCLUDE { BEGIN(include); return rpc_INCLUDE; }
25 <include>\< { return '<'; }
26 <include>{ALPHANUMDOT}+ {
27 yylval.strval = malloc(strlen(yytext)+1);
28 strcpy(yylval.strval, yytext);
31 <include>\> { BEGIN(INITIAL); return '>'; }
32 <include>. /* ignore */
34 RPC_Result { BEGIN(apidef); return RPC_RESULT; }
36 <apidef>STRING/[0-9]+ { BEGIN(str_num);
37 yylval.ival = rpc_STRING; return rpc_STRING; }
40 sscanf(yytext, "%d", &yylval.ival);
43 <str_num>. /* ignore */
46 char { yylval.ival = rpc_CHAR; return rpc_CHAR; }
47 int { yylval.ival = rpc_INT; return rpc_INT; }
48 signed[ \t\n]+int { yylval.ival = rpc_SINT; return rpc_SINT; }
49 unsigned[ \t\n]+int { yylval.ival = rpc_UINT; return rpc_UINT; }
50 INT8 { yylval.ival = rpc_INT8; return rpc_INT8; }
51 INT16 { yylval.ival = rpc_INT16; return rpc_INT16; }
52 INT32 { yylval.ival = rpc_INT32; return rpc_INT32; }
53 INT64 { yylval.ival = rpc_INT64; return rpc_INT64; }
54 UINT8 { yylval.ival = rpc_UINT8; return rpc_UINT8; }
55 UINT16 { yylval.ival = rpc_UINT16; return rpc_UINT16; }
56 UINT32 { yylval.ival = rpc_UINT32; return rpc_UINT32; }
57 UINT64 { yylval.ival = rpc_UINT64; return rpc_UINT64; }
58 float { yylval.ival = rpc_FLOAT; return rpc_FLOAT; }
59 double { yylval.ival = rpc_DOUBLE; return rpc_DOUBLE; }
60 void { yylval.ival = rpc_VOID; return rpc_VOID; }
63 "Specification change: IN Pointer argument needs to be prefixed \"const\" instead of \"IN\".\n"
69 "Specification change: OUT argument no longer needs to be prefixed with \"OUT\".\n"
73 INOUT { yylval.ival = rpc_INOUT; return rpc_INOUT; }
74 const { yylval.ival = rpc_CONST; return rpc_CONST; }
75 VARARRAY { yylval.ival = rpc_VARARRAY; return rpc_VARARRAY; }
76 ARRAYSIZE { yylval.ival = rpc_ARRAYSIZE; return rpc_ARRAYSIZE; }
79 yylval.strval = malloc(strlen(yytext)+1);
80 strcpy(yylval.strval, yytext);
88 \; { BEGIN(INITIAL); return ';'; }
90 } /* end of <apidef> */
92 #.*\n /* ignore CPP directives */
95 fprintf(stderr, "Unknown keyword %s\n", yytext);
99 [ \t\n]+ /* eat up whitespace */
105 PORT { BEGIN(portdef); return DEFINE_PORT; }
108 sscanf(yytext, "%d", &yylval.ival);
112 <apidef>ADDR/[0-9]+ { BEGIN(addr_num); yylval.ival = _ADDR; return _ADDR; }
115 sscanf(yytext, "%d", &yylval.ival);
121 * function to free the buffer which flex allocates but not frees
124 free_flex_buffer(void)
126 yy_delete_buffer(YY_CURRENT_BUFFER);
130 * dummy function to avoid a warning of not using 'yyunput'