summaryrefslogtreecommitdiff
path: root/tools/llvmc/ConfigLexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvmc/ConfigLexer.l')
-rw-r--r--tools/llvmc/ConfigLexer.l135
1 files changed, 135 insertions, 0 deletions
diff --git a/tools/llvmc/ConfigLexer.l b/tools/llvmc/ConfigLexer.l
new file mode 100644
index 0000000000..58ddd2bdbd
--- /dev/null
+++ b/tools/llvmc/ConfigLexer.l
@@ -0,0 +1,135 @@
+/*===- ConfigLexer.l - Scanner for CompilerDriver Config Files -*- C++ -*--===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Reid Spencer and is distributed under the
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the flex scanner for configuration files for the
+// llvmc CompilerDriver.
+//
+//===----------------------------------------------------------------------===*/
+
+
+%option prefix="Config"
+%option yylineno
+%option nostdinit
+%option never-interactive
+%option batch
+%option noyywrap
+%option nodefault
+%option 8bit
+%option outfile="ConfigLexer.cpp"
+%option ecs
+%option noreject
+%option noyymore
+%array
+
+%{
+
+#include "ConfigLexer.h"
+
+#define YY_INPUT(buf,result,max_size) \
+ { \
+ assert(ConfigLexerInput != 0 && "Oops"); \
+ result = ConfigLexerInput->read(buf,max_size); \
+ if (result == 0 ) result = YY_NULL; \
+ }
+
+using namespace llvm;
+
+/* Conversion of text ints to binary */
+static int64_t IntToVal(const char *Buffer) {
+ int64_t Result = 0;
+ for (; *Buffer; Buffer++) {
+ int64_t OldRes = Result;
+ Result *= 10;
+ Result += *Buffer-'0';
+ }
+ return Result;
+}
+
+bool in_value = false;
+
+%}
+
+LANG lang|Lang|LANG
+PREPROCESSOR preprocessor|PreProcessor|PREPROCESSOR
+TRANSLATOR translator|Translator|TRANSLATOR
+OPTIMIZER optimizer|Optimizer|OPTIMIZER
+ASSEMBLER assembler|Assembler|ASSEMBLER
+LINKER linker|Linker|LINKER
+NAME name|Name|NAME
+NEEDED needed|Needed|NEEDED
+COMMAND command|Command|COMMAND
+PREPROCESSES preprocesses|PreProcesses|PREPROCESSES
+GROKS_DASH_O groks_dash_O|Groks_Dash_O|GROKS_DASH_O
+OPTIMIZES optimizes|Optimizes|OPTIMIZES
+Comment \#[^\n]*
+NewLine \n
+White [ \t]*
+Option [-A-Za-z0-9_:%+/\\|,]*
+Sep \.
+Eq \=
+String \"[^\"]*\"
+Integer [-+]?[0-9]+
+True true|True|TRUE
+False false|False|FALSE
+On on|On|ON
+Off off|Off|OFF
+Yes yes|Yes|YES
+No no|No|NO
+
+%%
+
+{NewLine} { in_value = false; ConfigLexerLine++; return EOLTOK; }
+{Comment} { /* Ignore comments */ }
+{White} { /* Ignore whitespace */ }
+
+{LANG} { if (in_value) { ConfigLexerData.StringVal = "lang";
+ return OPTION; } else return LANG; }
+{PREPROCESSOR} { if (in_value) { ConfigLexerData.StringVal = "preprocessor";
+ return OPTION; } else return PREPROCESSOR; }
+{TRANSLATOR} { if (in_value) { ConfigLexerData.StringVal = "translator";
+ return OPTION; } else return TRANSLATOR; }
+{OPTIMIZER} { if (in_value) { ConfigLexerData.StringVal = "optimizer";
+ return OPTION; } else return OPTIMIZER; }
+{ASSEMBLER} { if (in_value) { ConfigLexerData.StringVal = "assembler";
+ return OPTION; } else return ASSEMBLER; }
+{LINKER} { if (in_value) { ConfigLexerData.StringVal = "linker";
+ return OPTION; } else return LINKER; }
+{NAME} { if (in_value) { ConfigLexerData.StringVal = "name";
+ return OPTION; } else return NAME; }
+{NEEDED} { if (in_value) { ConfigLexerData.StringVal = "needed";
+ return OPTION; } else return NEEDED; }
+{COMMAND} { if (in_value) { ConfigLexerData.StringVal = "command";
+ return OPTION; } else return COMMAND; }
+{PREPROCESSES} { if (in_value) { ConfigLexerData.StringVal = "preprocesses";
+ return OPTION; } else return PREPROCESSES; }
+{GROKS_DASH_O} { if (in_value) { ConfigLexerData.StringVal = "groks_dash_O";
+ return OPTION; } else return GROKS_DASH_O; }
+{OPTIMIZES} { if (in_value) { ConfigLexerData.StringVal = "optimizes";
+ return OPTION; } else return OPTIMIZES; }
+{Sep} { if (in_value) { ConfigLexerData.StringVal = yytext;
+ return OPTION; } }
+
+@in@ { if (in_value) return IN_SUBST; else return ERRORTOK; }
+@out@ { if (in_value) return OUT_SUBST; else return ERRORTOK; }
+{True} { if (in_value) return TRUETOK; else return ERRORTOK; }
+{On} { if (in_value) return TRUETOK; else return ERRORTOK; }
+{Yes} { if (in_value) return TRUETOK; else return ERRORTOK; }
+{False} { if (in_value) return FALSETOK; else return ERRORTOK; }
+{Off} { if (in_value) return FALSETOK; else return ERRORTOK; }
+{No} { if (in_value) return FALSETOK; else return ERRORTOK; }
+
+{Eq} { in_value = true; return EQUALS; }
+{Option} { ConfigLexerData.StringVal = yytext; return OPTION; }
+{Integer} { ConfigLexerData.IntegerVal = IntToVal(yytext); return INTEGER; }
+{String} { yytext[yyleng-1] = 0; // nuke end quote
+ ConfigLexerData.StringVal = yytext+1; // Nuke start quote
+ return STRING;
+ }
+
+%%