More Functionality:
[oota-llvm.git] / tools / llvmc / ConfigLexer.l
1 /*===- ConfigLexer.l - Scanner for CompilerDriver Config Files -*- C++ -*--===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Reid Spencer and is distributed under the 
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the flex scanner for configuration files for the
11 // llvmc CompilerDriver.
12 //
13 //===----------------------------------------------------------------------===*/
14
15
16 %option prefix="Config"
17 %option yylineno
18 %option nostdinit
19 %option never-interactive
20 %option batch
21 %option noyywrap
22 %option nodefault
23 %option 8bit
24 %option outfile="ConfigLexer.cpp"
25 %option ecs
26 %option noreject
27 %option noyymore
28 %array
29
30 %{
31
32 #include "ConfigLexer.h"
33
34 #define YY_INPUT(buf,result,max_size) \
35   { \
36     assert(ConfigLexerInput != 0 && "Oops"); \
37     result = ConfigLexerInput->read(buf,max_size); \
38     if (result == 0 ) result = YY_NULL; \
39   }
40
41 #define YY_DECL ConfigLexerTokens llvm::Configlex()
42
43 #define yyterminate() { return EOFTOK; }
44
45 using namespace llvm;
46
47 /* Conversion of text ints to binary */
48 static int64_t IntToVal(const char *Buffer) {
49   int64_t Result = 0;
50   for (; *Buffer; Buffer++) {
51     int64_t OldRes = Result;
52     Result *= 10;
53     Result += *Buffer-'0';
54   }
55   return Result;
56 }
57
58 bool in_value = false;
59
60 %}
61
62 LANG            lang|Lang|LANG
63 PREPROCESSOR    preprocessor|PreProcessor|PREPROCESSOR
64 TRANSLATOR      translator|Translator|TRANSLATOR
65 OPTIMIZER       optimizer|Optimizer|OPTIMIZER
66 ASSEMBLER       assembler|Assembler|ASSEMBLER
67 LINKER          linker|Linker|LINKER
68 NAME            name|Name|NAME
69 REQUIRED        required|Required|REQUIRED
70 COMMAND         command|Command|COMMAND
71 PREPROCESSES    preprocesses|PreProcesses|PREPROCESSES
72 GROKS_DASH_O    groks_dash_O|Groks_Dash_O|GROKS_DASH_O
73 GROKS_O10N      groks_optimization|Groks_Optimization|GROKS_OPTIMIZATION
74 OPTIMIZES       optimizes|Optimizes|OPTIMIZES
75 OPT1            opt1|Opt1|OPT1
76 OPT2            opt2|Opt2|OPT2
77 OPT3            opt3|Opt3|OPT3
78 OPT4            opt4|Opt4|OPT4
79 OPT5            opt5|Opt5|OPT5
80 Comment         \#[^\n]*
81 NewLine         \n
82 White           [ \t]*
83 Option          [-A-Za-z0-9_:%+/\\|,]*
84 Sep             \.
85 Eq              \=
86 String          \"[^\"]*\"
87 Integer         [-+]?[0-9]+
88 True            true|True|TRUE
89 False           false|False|FALSE
90 On              on|On|ON
91 Off             off|Off|OFF
92 Yes             yes|Yes|YES
93 No              no|No|NO
94
95 %%
96
97 {NewLine}       { in_value = false; return EOLTOK; }
98 {Eq}            { in_value = true; return EQUALS; }
99 {Comment}       { /* Ignore comments */ }
100 {White}         { /* Ignore whitespace */ }
101
102 {LANG}          { if (in_value) { ConfigLexerData.StringVal = "lang"; 
103                     return OPTION;  } else return LANG; }
104 {PREPROCESSOR}  { if (in_value) { ConfigLexerData.StringVal = "preprocessor";
105                     return OPTION; } else return PREPROCESSOR; }
106 {TRANSLATOR}    { if (in_value) { ConfigLexerData.StringVal = "translator";
107                     return OPTION; } else return TRANSLATOR; }
108 {OPTIMIZER}     { if (in_value) { ConfigLexerData.StringVal = "optimizer";
109                     return OPTION; } else return OPTIMIZER; }
110 {ASSEMBLER}     { if (in_value) { ConfigLexerData.StringVal = "assembler";
111                     return OPTION; } else return ASSEMBLER; }
112 {LINKER}        { if (in_value) { ConfigLexerData.StringVal = "linker";
113                     return OPTION; } else return LINKER; }
114 {NAME}          { if (in_value) { ConfigLexerData.StringVal = "name";
115                     return OPTION; } else return NAME; }
116 {REQUIRED}      { if (in_value) { ConfigLexerData.StringVal = "required";
117                     return OPTION; } else return REQUIRED; }
118 {COMMAND}       { if (in_value) { ConfigLexerData.StringVal = "command";
119                     return OPTION; } else return COMMAND; }
120 {PREPROCESSES}  { if (in_value) { ConfigLexerData.StringVal = "preprocesses";
121                     return OPTION; } else return PREPROCESSES; }
122 {GROKS_DASH_O}  { if (in_value) { ConfigLexerData.StringVal = "groks_dash_O";
123                     return OPTION; } else return GROKS_DASH_O; }
124 {GROKS_O10N}    { if (in_value) { ConfigLexerData.StringVal = 
125                     "groks_optimization"; return OPTION; } 
126                     else return GROKS_O10N; }
127 {OPTIMIZES}     { if (in_value) { ConfigLexerData.StringVal = "optimizes";
128                     return OPTION; } else return OPTIMIZES; }
129 {OPT1}          { if (in_value) { ConfigLexerData.StringVal = "opt1";
130                     return OPTION; } else return OPT1; }
131 {OPT2}          { if (in_value) { ConfigLexerData.StringVal = "opt2";
132                     return OPTION; } else return OPT2; }
133 {OPT3}          { if (in_value) { ConfigLexerData.StringVal = "opt3";
134                     return OPTION; } else return OPT3; }
135 {OPT4}          { if (in_value) { ConfigLexerData.StringVal = "opt4";
136                     return OPTION; } else return OPT4; }
137 {OPT5}          { if (in_value) { ConfigLexerData.StringVal = "opt5";
138                     return OPTION; } else return OPT5; }
139 @in@            { if (in_value) return IN_SUBST; else return ERRORTOK;  }
140 @out@           { if (in_value) return OUT_SUBST; else return ERRORTOK; }
141 {True}          { if (in_value) return TRUETOK; else return ERRORTOK; }
142 {On}            { if (in_value) return TRUETOK; else return ERRORTOK; }
143 {Yes}           { if (in_value) return TRUETOK; else return ERRORTOK; }
144 {False}         { if (in_value) return FALSETOK; else return ERRORTOK; }
145 {Off}           { if (in_value) return FALSETOK; else return ERRORTOK; }
146 {No}            { if (in_value) return FALSETOK; else return ERRORTOK; }
147
148 {Option}        { ConfigLexerData.StringVal = yytext; return OPTION; }
149 {Integer}       { ConfigLexerData.IntegerVal = IntToVal(yytext); return INTEGER; }
150 {String}        { yytext[yyleng-1] = 0;          // nuke end quote
151                   ConfigLexerData.StringVal = yytext+1;  // Nuke start quote
152                   return STRING;
153                 }
154 {Sep}           { if (in_value) { ConfigLexerData.StringVal = yytext;
155                     return OPTION; } }
156
157
158 %%