:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / rpcrt4 / midl / idl.l
1 %{
2 #include "midl.h"
3 #include "idl.tab.h"
4 #include <string.h>
5
6 int lineno = 1;
7 void yyerror(char* s);
8 char* current_file;
9 int nr_errors = 0;
10
11 #define TOK(n) { yylval.token = n; return n; }
12
13 %}
14
15 DIGIT [0-9]
16 ID    [a-zA-Z_][a-zA-Z0-9_]*
17 UUID  [a-z0-9]*
18
19 %%
20
21 uuid                { TOK(UUID_KEYWORD); }
22 version             { TOK(VERSION_KEYWORD); }
23 pointer_default     { TOK(POINTER_DEFAULT_KEYWORD); }
24 unique              { TOK(UNIQUE_KEYWORD); }
25 interface           { TOK(INTERFACE_KEYWORD); }
26 aggregatable        { TOK(AGGREGATABLE_KEYWORD); }
27 allocate            { TOK(ALLOCATE_KEYWORD); }
28 appobject           { TOK(APPOBJECT_KEYWORD); }
29
30
31 all_nodes           { TOK(ALL_NODES_KEYWORD); }
32 single_node         { TOK(SINGLE_NODE_KEYWORD); }
33 free                { TOK(FREE_KEYWORD); }
34 dont_free           { TOK(DONT_FREE_KEYWORD);  }
35
36 typedef             { TOK(TYPEDEF_KEYWORD); }
37 struct              { TOK(STRUCT_KEYWORD); }
38 const               { TOK(CONST_KEYWORD); }
39
40 signed              { TOK(SIGNED_KEYWORD); }
41 unsigned            { TOK(UNSIGNED_KEYWORD); }
42
43 in                  { TOK(IN_KEYWORD); }
44 out                 { TOK(OUT_KEYWORD); }
45 string              { TOK(STRING_KEYWORD); }
46 implicit_handle     { TOK(IMPLICIT_HANDLE_KEYWORD); }
47 auto_handle         { TOK(AUTO_HANDLE_KEYWORD); }
48 size_is             { TOK(SIZE_IS_KEYWORD); }
49 length_is           { TOK(LENGTH_IS_KEYWORD); }
50
51 {ID}                { int n;
52                       if ((n = token_to_type(yytext)) != 0)
53                       {
54                           yylval.tval = n;
55                           return(TYPE_KEYWORD);
56                       }
57                       else
58                       {
59                           yylval.id = strdup(yytext); 
60                           return(ID_TOKEN); 
61                       }
62                      }
63
64 {DIGIT}+                   { yylval.number = atoi(yytext); 
65                              return(NUMBER_TOKEN); }
66
67 {DIGIT}+"."{DIGIT}+        { char* ebuf;
68                              yylval.version.major = strtoul(yytext, &ebuf, 0);
69                              yylval.version.minor = strtoul(ebuf + 1, NULL, 0);
70                              return(VERSION_TOKEN); }
71
72 {UUID}+"-"{UUID}+"-"{UUID}+"-"{UUID}+"-"{UUID}+ { yylval.uuid = strdup(yytext);
73                                                   return(UUID_TOKEN); }
74
75 ";"                                { TOK(LINE_TERMINATOR); }
76
77 "("                                { TOK(LEFT_BRACKET); }
78
79 ")"                                { TOK(RIGHT_BRACKET); }
80
81 ","                                { TOK(COMMA); }
82
83 "{"                                { TOK(LCURLY_BRACKET); }
84
85 "}"                                { TOK(RCURLY_BRACKET); }
86
87 "["                                { TOK(LSQBRACKET); }
88
89 "]"                                { TOK(RSQBRACKET); }
90
91 "*"                                { TOK(STAR); }
92
93 "="                                { TOK(ASSIGNMENT); }
94
95 \n                       lineno++;
96
97 [ \t\r]+                 ;
98
99 .                        yyerror("invalid character");
100
101 %%
102
103 void yyerror(char* s)
104 {
105      nr_errors++;
106      printf("%s:%d: %s at %s\n", current_file, lineno, s, yytext);
107 }
108
109 void yyerror1(char* s)
110 {
111      nr_errors++;
112      printf("%s:%d: %s\n", current_file, lineno, s);
113 }
114