%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
+%option noreject
+%pointer
%{
if (result == 0 ) result = YY_NULL; \
}
+#define YY_FATAL_ERROR(msg) \
+ { \
+ assert(ConfigLexerInput != 0 && "Oops"); \
+ ConfigLexerInput->error(msg); \
+ }
+
#define YY_DECL ConfigLexerTokens llvm::Configlex()
#define yyterminate() { return EOFTOK; }
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';
+inline llvm::ConfigLexerTokens
+handleNameContext(llvm::ConfigLexerTokens token) {
+ ConfigLexerState.StringVal = yytext;
+ if (ConfigLexerState.in_value)
+ return OPTION;
+ return token;
+}
+
+inline llvm::ConfigLexerTokens
+handleSubstitution(llvm::ConfigLexerTokens token) {
+ if (ConfigLexerState.in_value) {
+ ConfigLexerState.StringVal = yytext;
+ return token;
}
- return Result;
+ YY_FATAL_ERROR("Substitition tokens not allowed in names" );
+ return ERRORTOK;
}
-bool in_value = false;
+inline llvm::ConfigLexerTokens handleValueContext(llvm::ConfigLexerTokens token) {
+ ConfigLexerState.StringVal = yytext;
+ if (ConfigLexerState.in_value)
+ return token;
+ return OPTION;
+}
%}
-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
-REQUIRED required|Required|REQUIRED
COMMAND command|Command|COMMAND
-PREPROCESSES preprocesses|PreProcesses|PREPROCESSES
-GROKS_DASH_O groks_dash_O|Groks_Dash_O|GROKS_DASH_O
-GROKS_O10N groks_optimization|Groks_Optimization|GROKS_OPTIMIZATION
-OPTIMIZES optimizes|Optimizes|OPTIMIZES
+LANG lang|Lang|LANG
+LIBS libs|Libs|LIBS
+LINKER linker|Linker|LINKER
+NAME name|Name|NAME
OPT1 opt1|Opt1|OPT1
OPT2 opt2|Opt2|OPT2
OPT3 opt3|Opt3|OPT3
OPT4 opt4|Opt4|OPT4
OPT5 opt5|Opt5|OPT5
-Comment \#[^\n]*
-NewLine \n
-White [ \t]*
-Option [-A-Za-z0-9_:%+/\\|,]*
-Sep \.
+OPTIMIZER optimizer|Optimizer|OPTIMIZER
+OUTPUT output|Output|OUTPUT
+PREPROCESSES preprocesses|PreProcesses|PREPROCESSES
+PREPROCESSOR preprocessor|PreProcessor|PREPROCESSOR
+REQUIRED required|Required|REQUIRED
+TRANSLATES translates|Translates|TRANSLATES
+TRANSLATOR translator|Translator|TRANSLATOR
+VERSION version|Version|VERSION
+
+True true|True|TRUE|on|On|ON|yes|Yes|YES
+False false|False|FALSE|off|Off|OFF|no|No|NO
+Bytecode bc|BC|bytecode|Bytecode|BYTECODE
+Assembly asm|ASM|assembly|Assembly|ASSEMBLY
+
+BadSubst \%[a-zA-Z]*\%
+Comment \#[^\r\n]*\r?\n
+NewLine \r?\n
Eq \=
+EscNewLine \\\r?\n
+Option [-A-Za-z0-9_:%+/\\|,][-A-Za-z0-9_:+/\\|,@]*
+Sep \.
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
+White [ \t]*
+
%%
-{NewLine} { in_value = false; return EOLTOK; }
-{Eq} { in_value = true; return EQUALS; }
-{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; }
-{REQUIRED} { if (in_value) { ConfigLexerData.StringVal = "required";
- return OPTION; } else return REQUIRED; }
-{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; }
-{GROKS_O10N} { if (in_value) { ConfigLexerData.StringVal =
- "groks_optimization"; return OPTION; }
- else return GROKS_O10N; }
-{OPTIMIZES} { if (in_value) { ConfigLexerData.StringVal = "optimizes";
- return OPTION; } else return OPTIMIZES; }
-{OPT1} { if (in_value) { ConfigLexerData.StringVal = "opt1";
- return OPTION; } else return OPT1; }
-{OPT2} { if (in_value) { ConfigLexerData.StringVal = "opt2";
- return OPTION; } else return OPT2; }
-{OPT3} { if (in_value) { ConfigLexerData.StringVal = "opt3";
- return OPTION; } else return OPT3; }
-{OPT4} { if (in_value) { ConfigLexerData.StringVal = "opt4";
- return OPTION; } else return OPT4; }
-{OPT5} { if (in_value) { ConfigLexerData.StringVal = "opt5";
- return OPTION; } else return OPT5; }
-@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; }
-
-{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;
+{White} { if (ConfigLexerState.in_value) return SPACE; }
+
+{Comment} { /* Ignore comments */
+ ConfigLexerState.in_value = false;
+ ConfigLexerState.lineNum++;
+ return EOLTOK;
+ }
+
+{EscNewLine} { ConfigLexerState.lineNum++;
+ /* Don't return EOLTOK! */
+ }
+
+{NewLine} { ConfigLexerState.in_value = false;
+ ConfigLexerState.lineNum++;
+ return EOLTOK;
+ }
+
+{Eq} { ConfigLexerState.in_value = true;
+ return EQUALS;
}
-{Sep} { if (in_value) { ConfigLexerData.StringVal = yytext;
- return OPTION; } }
+{Sep} { return SEPARATOR; }
+
+{VERSION} { return handleNameContext(VERSION_TOK); }
+
+{LANG} { return handleNameContext(LANG); }
+{LIBS} { return handleNameContext(LIBS); }
+{NAME} { return handleNameContext(NAME); }
+{OPT1} { return handleNameContext(OPT1); }
+{OPT2} { return handleNameContext(OPT2); }
+{OPT3} { return handleNameContext(OPT3); }
+{OPT4} { return handleNameContext(OPT4); }
+{OPT5} { return handleNameContext(OPT5); }
+
+{PREPROCESSOR} { return handleNameContext(PREPROCESSOR); }
+{COMMAND} { return handleNameContext(COMMAND); }
+{REQUIRED} { return handleNameContext(REQUIRED); }
+
+{TRANSLATOR} { return handleNameContext(TRANSLATOR); }
+{PREPROCESSES} { return handleNameContext(PREPROCESSES); }
+{OUTPUT} { return handleNameContext(OUTPUT); }
+
+{OPTIMIZER} { return handleNameContext(OPTIMIZER); }
+{TRANSLATES} { return handleNameContext(TRANSLATES); }
+
+{ASSEMBLER} { return handleNameContext(ASSEMBLER); }
+
+{LINKER} { return handleNameContext(LINKER); }
+
+%args% { return handleSubstitution(ARGS_SUBST); }
+%bindir% { return handleSubstitution(BINDIR_SUBST); }
+%defs% { return handleSubstitution(DEFS_SUBST); }
+%in% { return handleSubstitution(IN_SUBST); }
+%incls% { return handleSubstitution(INCLS_SUBST); }
+%libdir% { return handleSubstitution(LIBDIR_SUBST); }
+%libs% { return handleSubstitution(LIBS_SUBST); }
+%llvmgccdir% { return handleSubstitution(LLVMGCCDIR_SUBST); }
+%llvmgccarch% { return handleSubstitution(LLVMGCCARCH_SUBST); }
+%llvmgcc% { return handleSubstitution(LLVMGCC_SUBST); }
+%llvmgxx% { return handleSubstitution(LLVMGXX_SUBST); }
+%llvmcc1% { return handleSubstitution(LLVMCC1_SUBST); }
+%llvmcc1plus% { return handleSubstitution(LLVMCC1PLUS_SUBST); }
+%opt% { return handleSubstitution(OPT_SUBST); }
+%out% { return handleSubstitution(OUT_SUBST); }
+%stats% { return handleSubstitution(STATS_SUBST); }
+%target% { return handleSubstitution(TARGET_SUBST); }
+%time% { return handleSubstitution(TIME_SUBST); }
+%verbose% { return handleSubstitution(VERBOSE_SUBST); }
+%fOpts% { return handleSubstitution(FOPTS_SUBST); }
+%MOpts% { return handleSubstitution(MOPTS_SUBST); }
+%WOpts% { return handleSubstitution(WOPTS_SUBST); }
+
+{Assembly} { return handleValueContext(ASSEMBLY); }
+{Bytecode} { return handleValueContext(BYTECODE); }
+{True} { return handleValueContext(TRUETOK); }
+{False} { return handleValueContext(FALSETOK); }
+
+{Option} { ConfigLexerState.StringVal = yytext; return OPTION; }
+{String} { ConfigLexerState.StringVal = yytext+1; // Nuke start quote
+ ConfigLexerState.StringVal.erase(
+ --ConfigLexerState.StringVal.end());
+ return STRING;
+ }
+{BadSubst} { YY_FATAL_ERROR("Invalid substitution token"); }
%%