diff options
Diffstat (limited to 'tools/llvmc/ConfigLexer.l')
-rw-r--r-- | tools/llvmc/ConfigLexer.l | 135 |
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; + } + +%% |