Initialize Tizen 2.3
[external/ragel.git] / examples / cppscan.lex
1 /*
2  * flex equivalent to cppscan.rl
3  */
4
5 %{
6
7 #include <stdio.h>
8
9 #define TK_Dlit 256
10 #define TK_Slit 257
11 #define TK_Float 258
12 #define TK_Id 259
13 #define TK_NameSep 260
14 #define TK_Arrow 261
15 #define TK_PlusPlus 262
16 #define TK_MinusMinus 263
17 #define TK_ArrowStar 264
18 #define TK_DotStar 265
19 #define TK_ShiftLeft 266
20 #define TK_ShiftRight 267
21 #define TK_IntegerDecimal 268
22 #define TK_IntegerOctal 269
23 #define TK_IntegerHex 270
24 #define TK_EqualsEquals 271
25 #define TK_NotEquals 272
26 #define TK_AndAnd 273
27 #define TK_OrOr 274
28 #define TK_MultAssign 275
29 #define TK_DivAssign 276
30 #define TK_PercentAssign 277
31 #define TK_PlusAssign 278
32 #define TK_MinusAssign 279
33 #define TK_AmpAssign 280
34 #define TK_CaretAssign 281
35 #define TK_BarAssign 282
36 #define TK_DotDotDot 283
37 #define TK_Whitespace 284
38 #define TK_Comment 285
39
40 int line = 1, col = 1;
41
42 void token( int tok, char *data, int len )
43 {
44         printf( "<%i> ", tok );
45         for ( int i = 0; i < len; i++ )
46                 fputc( data[i], stdout );
47         fputc( '\n', stdout );
48
49         /* Count newlines and columns. This code is here mainly for having some
50          * code in the token routine when commenting out the above output during
51          * performance testing. */
52         for ( int i = 0; i < len; i ++ ) {
53                 if ( data[i] == '\n' ) {
54                         line += 1;
55                         col = 1;
56                 }
57                 else {
58                         col += 1;
59                 }
60         }
61 }
62
63
64 %}
65
66 %x COMMENT
67
68 FRACT_CONST             [0-9]*\.[0-9]+|[0-9]+\.
69 EXPONENT                [eE][+\-]?[0-9]+
70 FLOAT_SUFFIX    [flFL]
71
72 %%
73
74         /* Single and double literals. */
75 L?\'([^\'\\\n]|\\.)*\' {
76         token( TK_Slit, yytext, yyleng );
77 }
78
79 L?\"([^\"\\\n]|\\.)*\" {
80         token( TK_Dlit, yytext, yyleng );
81 }
82
83 [a-zA-Z_][a-zA-Z0-9_]* {
84         token( TK_Id, yytext, yyleng );
85 }
86
87 {FRACT_CONST}{EXPONENT}?{FLOAT_SUFFIX}?|[0-9]+{EXPONENT}{FLOAT_SUFFIX}? {
88         token( TK_Float, yytext, yyleng );
89 }
90
91 (0|[1-9][0-9]*)[ulUL]{0,3} {
92         token( TK_IntegerDecimal, yytext, yyleng );
93 }
94
95 0[0-9]+[ulUL]{0,2} {
96         token( TK_IntegerOctal, yytext, yyleng );
97 }
98
99 0x[0-9a-fA-F]+[ulUL]{0,2} {
100         token( TK_IntegerHex, yytext, yyleng );
101 }
102
103 :: token( TK_NameSep, yytext, yyleng );
104 == token( TK_EqualsEquals, yytext, yyleng );
105 != token( TK_NotEquals, yytext, yyleng );
106 && token( TK_AndAnd, yytext, yyleng );
107 \|\| token( TK_OrOr, yytext, yyleng );
108 \*= token( TK_MultAssign, yytext, yyleng );
109 \/= token( TK_DivAssign, yytext, yyleng );
110 %= token( TK_PercentAssign, yytext, yyleng );
111 \+= token( TK_PlusAssign, yytext, yyleng );
112 -= token( TK_MinusAssign, yytext, yyleng );
113 &= token( TK_AmpAssign, yytext, yyleng );
114 ^= token( TK_CaretAssign, yytext, yyleng );
115 \|= token( TK_BarAssign, yytext, yyleng );
116 \+\+ token( TK_PlusPlus, yytext, yyleng );
117 -- token( TK_MinusMinus, yytext, yyleng );
118 -> token( TK_Arrow, yytext, yyleng );
119 ->\* token( TK_ArrowStar, yytext, yyleng );
120 \.\* token( TK_DotStar, yytext, yyleng );
121 \.\.\. token( TK_DotDotDot, yytext, yyleng );
122
123 \/\*                            BEGIN(COMMENT);
124 <COMMENT>\*\/           BEGIN(INITIAL);
125 <COMMENT>(.|\n)         { }
126
127 \/\/.*\n                        {}
128 [^!-~]+                         {}
129
130 [!-/:-@\[-`{-~] token( yytext[0], yytext, yyleng );
131         
132 %%
133
134 int yywrap()
135 {
136         /* Once the input is done, no more. */
137         return 1;
138 }
139
140 int main()
141 {
142         yylex();
143 }