-{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
+{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} { 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());