mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
bf43772038
- cleaned up lexical scanner - added support for "lang.optN" configuration items - added temporary file support (ala lib/System) - corrected logic for deciding which phases to run - consolidated the Action and ActionPattern classes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15765 91177308-0d34-0410-b5e6-96231b3b80d8
159 lines
6.1 KiB
C++
159 lines
6.1 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 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; \
|
|
}
|
|
|
|
#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';
|
|
}
|
|
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
|
|
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
|
|
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 \.
|
|
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; 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;
|
|
}
|
|
{Sep} { if (in_value) { ConfigLexerData.StringVal = yytext;
|
|
return OPTION; } }
|
|
|
|
|
|
%%
|