llvm-6502/tools/llvmc/ConfigLexer.l
Reid Spencer bae6825e1d Implement many new features for llvmc. This is the first version that will
actually execute actions and it is been shown to optimize a Stacker program


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15912 91177308-0d34-0410-b5e6-96231b3b80d8
2004-08-19 04:49:47 +00:00

182 lines
6.0 KiB
C++

/*===- 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 nodefault
%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
handleContext(const char* tokenText, llvm::ConfigLexerTokens token) {
if (ConfigLexerState.in_value) {
ConfigLexerState.StringVal = tokenText;
return OPTION;
}
return token;
}
inline llvm::ConfigLexerTokens
handleSubstitution(llvm::ConfigLexerTokens token) {
if (ConfigLexerState.in_value)
return token;
YY_FATAL_ERROR("Substitition tokens not allowed in names" );
return ERRORTOK;
};
inline llvm::ConfigLexerTokens handleBoolean(llvm::ConfigLexerTokens token) {
if (ConfigLexerState.in_value)
return token;
YY_FATAL_ERROR("Boolean values not allowed in names");
return ERRORTOK;
}
%}
ASSEMBLER assembler|Assembler|ASSEMBLER
BadSubst \@[^iots][a-zA-Z]\@
COMMAND command|Command|COMMAND
Comment \#[^\n]*\n
NewLine \n
Eq \=
EscNewLine \\\n
GROKS_DASH_O groks_dash_O|Groks_Dash_O|GROKS_DASH_O
LANG lang|Lang|LANG
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
OPTIMIZES optimizes|Optimizes|OPTIMIZES
Option [-A-Za-z0-9_:%+/\\|,][-A-Za-z0-9_:%+/\\|,@]*
OUTPUT_IS_ASM output_is_asm|Output_Is_Asm|OUTPUT_IS_ASM
PREPROCESSES preprocesses|PreProcesses|PREPROCESSES
PREPROCESSOR preprocessor|PreProcessor|PREPROCESSOR
REQUIRED required|Required|REQUIRED
Sep \.
String \"[^\"]*\"
TRANSLATES translates|Translates|TRANSLATES
TRANSLATOR translator|Translator|TRANSLATOR
White [ \t]*
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} { /* Ignore whitespace */ }
{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;
}
{LANG} { return handleContext("lang",LANG); }
{PREPROCESSOR} { return handleContext("preprocessor",PREPROCESSOR); }
{TRANSLATOR} { return handleContext("translator",TRANSLATOR); }
{OPTIMIZER} { return handleContext("optimizer",OPTIMIZER); }
{ASSEMBLER} { return handleContext("assembler",ASSEMBLER); }
{LINKER} { return handleContext("linker",LINKER); }
{NAME} { return handleContext("name",NAME); }
{REQUIRED} { return handleContext("required",REQUIRED); }
{COMMAND} { return handleContext("command",COMMAND); }
{PREPROCESSES} { return handleContext("preprocesses",PREPROCESSES); }
{TRANSLATES} { return handleContext("translates",TRANSLATES); }
{OPTIMIZES} { return handleContext("optimizes",OPTIMIZES); }
{GROKS_DASH_O} { return handleContext("groks_dash_O",GROKS_DASH_O); }
{OUTPUT_IS_ASM} { return handleContext("output_ias_asm",OUTPUT_IS_ASM); }
{OPT1} { return handleContext("opt1",OPT1); }
{OPT2} { return handleContext("opt2",OPT2); }
{OPT3} { return handleContext("opt3",OPT3); }
{OPT4} { return handleContext("opt4",OPT4); }
{OPT5} { return handleContext("opt5",OPT5); }
@in@ { return handleSubstitution(IN_SUBST); }
@out@ { return handleSubstitution(OUT_SUBST); }
@time@ { return handleSubstitution(TIME_SUBST); }
@stats@ { return handleSubstitution(STATS_SUBST); }
@opt@ { return handleSubstitution(OPT_SUBST); }
@target@ { return handleSubstitution(TARGET_SUBST); }
{BadSubst} { YY_FATAL_ERROR("Invalid substitution token"); }
{True} { return handleBoolean(TRUETOK); }
{On} { return handleBoolean(TRUETOK); }
{Yes} { return handleBoolean(TRUETOK); }
{False} { return handleBoolean(FALSETOK); }
{Off} { return handleBoolean(FALSETOK); }
{No} { return handleBoolean(FALSETOK); }
{Option} { ConfigLexerState.StringVal = yytext; return OPTION; }
{String} { ConfigLexerState.StringVal = yytext+1; // Nuke start quote
ConfigLexerState.StringVal.erase(
--ConfigLexerState.StringVal.end());
return STRING;
}
{Sep} { if (ConfigLexerState.in_value) { ConfigLexerState.StringVal = yytext;
return OPTION; } }
%%