Michael Uleysky
9 years ago
commit
be4c41c762
8 changed files with 163 additions and 0 deletions
@ -0,0 +1,21 @@
|
||||
CFLAGS=-O2 -g
|
||||
|
||||
OBJECTS=main.o debug.o init.o parser/lexical.o
|
||||
|
||||
|
||||
|
||||
makemap: $(OBJECTS) |
||||
g++ $(CFLAGS) -o $@ $(OBJECTS)
|
||||
|
||||
main.o: debug.h init.h |
||||
init.o: parser/lexical.h parser/parser.h debug.h init.h |
||||
parser/lexical.o: parser/parser.h debug.h |
||||
|
||||
parser/lexical.h parser/lexical.cpp: parser/lexical.l |
||||
cd parser && flex lexical.l
|
||||
|
||||
clean: |
||||
rm -f *.o parser/*.o parser/lexical.{cpp,h}
|
||||
|
||||
distclean: clean |
||||
rm -f makemap
|
@ -0,0 +1,19 @@
|
||||
#include <iostream> |
||||
#include "debug.h" |
||||
|
||||
std::ostream& COUT(debug_level dl) |
||||
{ |
||||
if(dl==ERROR) return std::cerr; |
||||
if(dl>=SetDebugLevel(INTERNALREQUEST)) std::cout.clear(); |
||||
else std::cout.setstate(std::cout.failbit); |
||||
return std::cout; |
||||
} |
||||
|
||||
debug_level SetDebugLevel(debug_level dl) |
||||
{ |
||||
static debug_level DEBUG_LEVEL=INFO; |
||||
if(dl==INTERNALREQUEST) return DEBUG_LEVEL; |
||||
debug_level s=DEBUG_LEVEL; |
||||
DEBUG_LEVEL=dl; |
||||
return s; |
||||
} |
@ -0,0 +1,11 @@
|
||||
#ifndef DEBUG_H |
||||
#define DEBUG_H |
||||
#include <iostream> |
||||
|
||||
enum debug_level {INTERNALREQUEST,DEBUG,INFO,WARNING,ERROR}; |
||||
|
||||
std::ostream& COUT(debug_level dl); |
||||
|
||||
debug_level SetDebugLevel(debug_level dl=INTERNALREQUEST); |
||||
|
||||
#endif |
@ -0,0 +1,26 @@
|
||||
#include "init.h" |
||||
#include "debug.h" |
||||
#include "parser/lexical.h" |
||||
#include "parser/parser.h" |
||||
|
||||
int ParseConfigFile(char* config) |
||||
{ |
||||
yyscan_t scanner; |
||||
struct lexical_extra extra; |
||||
FILE* conffd; |
||||
|
||||
conffd=fopen(config,"r"); |
||||
if(conffd==0) |
||||
{ |
||||
COUT(ERROR)<<"Can't open file "<<config<<std::endl; |
||||
return 1; |
||||
} |
||||
extra.filename=config; |
||||
extra.inclevel=0; |
||||
extra.maxinclevel=10; |
||||
conflex_init_extra(&extra,&scanner); |
||||
confset_in(conffd,scanner); |
||||
conflex(scanner); |
||||
conflex_destroy(scanner); |
||||
fclose(conffd); |
||||
} |
@ -0,0 +1,6 @@
|
||||
#ifndef INIT_H |
||||
#define INIT_H |
||||
|
||||
int ParseConfigFile(char* config); |
||||
|
||||
#endif |
@ -0,0 +1,13 @@
|
||||
#include "debug.h" |
||||
#include "init.h" |
||||
|
||||
int main(int argc, char** argv) |
||||
{ |
||||
if(argc!=2) return 1; |
||||
|
||||
SetDebugLevel(DEBUG); |
||||
|
||||
ParseConfigFile(argv[1]); |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,58 @@
|
||||
%option 8bit reentrant |
||||
%option warn |
||||
%option yylineno |
||||
%option noyywrap |
||||
%option yylineno |
||||
%option header-file="lexical.h" |
||||
%option outfile="lexical.cpp" |
||||
%option prefix="conf" |
||||
%option extra-type="const struct lexical_extra*" |
||||
%x STRING |
||||
%x PARSE |
||||
|
||||
%{ |
||||
#include <string> |
||||
#include "../debug.h" |
||||
#include "parser.h" |
||||
int nc; |
||||
%} |
||||
|
||||
%% |
||||
include\(\".+\"\); { |
||||
if(yyextra->inclevel>=yyextra->maxinclevel) { COUT(ERROR)<<"Max include level reached in file "<<yyextra->filename<<" at line "<<yylineno<<std::endl; return 1; } |
||||
yyscan_t scanner; |
||||
struct lexical_extra extra; |
||||
std::string fname(yytext+9,yyleng-12); |
||||
FILE* fd; |
||||
fd=fopen(fname.c_str(),"r"); |
||||
if(fd==0) { COUT(ERROR)<<"Can't open file "<<fname<<std::endl; return 1; } |
||||
COUT(DEBUG)<<"Include "<<fname<<std::endl; |
||||
extra.filename=fname.c_str(); |
||||
extra.inclevel=yyextra->inclevel+1; |
||||
extra.maxinclevel=yyextra->maxinclevel; |
||||
yylex_init_extra(&extra,&scanner); |
||||
yyset_in(fd,scanner); |
||||
yylex(scanner); |
||||
yylex_destroy(scanner); |
||||
fclose(fd); |
||||
|
||||
} |
||||
[a-zA-Z][a-zA-Z0-9_]* printf("NAME\n"); BEGIN(PARSE); |
||||
<PARSE>[+-]?[0-9]+ printf("INTEGER\n"); |
||||
<PARSE>[+-]?[0-9]+(\.[0-9]*)?([eE][+-][0-9]+)? printf("REAL\n"); |
||||
<PARSE>\( printf("OBRACE\n"); |
||||
<PARSE>\) printf("CBRACE\n"); |
||||
<PARSE>\; printf("ENDL\n"); BEGIN(0); |
||||
<PARSE>= printf("ASSIGN\n"); |
||||
<PARSE>[a-zA-Z][a-zA-Z0-9_]* printf("IDENTIFIER\n"); |
||||
<PARSE,INITIAL>[ ,\n\t] |
||||
<PARSE,INITIAL>\#.* |
||||
<PARSE>\" BEGIN(STRING); nc=0; |
||||
<PARSE,INITIAL>. COUT(ERROR)<<"Unknown symbol "<<yytext<<" in file "<<yyextra->filename<<" at line "<<yylineno<<std::endl; |
||||
<STRING>\\\\ nc++; |
||||
<STRING>\\\" nc++; |
||||
<STRING>\" BEGIN(PARSE); printf("STRING%d\n",nc); |
||||
<STRING>. nc++; |
||||
<STRING><<EOF>> COUT(ERROR)<<"Unclosed quote!"<<std::endl; yyterminate(); |
||||
<<EOF>> yyterminate(); |
||||
%% |
Loading…
Reference in new issue