/*===- 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 nostdinit %option never-interactive %option batch %option noyywrap %option 8bit %option outfile="ConfigLexer.cpp" %option ecs %option noyymore %option noreject %pointer %{ #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; \ } #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; 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; } YY_FATAL_ERROR("Substitition tokens not allowed in names" ); return ERRORTOK; } inline llvm::ConfigLexerTokens handleValueContext(llvm::ConfigLexerTokens token) { ConfigLexerState.StringVal = yytext; if (ConfigLexerState.in_value) return token; return OPTION; } %} ASSEMBLER assembler|Assembler|ASSEMBLER COMMAND command|Command|COMMAND 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 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 \"[^\"]*\" White [ \t]* %% {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()); return STRING; } {BadSubst} { YY_FATAL_ERROR("Invalid substitution token"); } %%