From 1fe251f27d9e3b8d91a5486ab96099ba83d35f81 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 4 Feb 2009 18:45:55 +0000 Subject: [PATCH] added -lfl to LDFLAGS in main Makefile, added parser/parser.{lex,yy} and parser/Makefile (for real this time) git-svn-id: svn://anubis/fart/trunk@79 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- Makefile | 2 ++ parser/Makefile | 29 ++++++++++++++++++ parser/parser.lex | 37 +++++++++++++++++++++++ parser/parser.yy | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 parser/Makefile create mode 100644 parser/parser.lex create mode 100644 parser/parser.yy diff --git a/Makefile b/Makefile index 7ff76fc..f74b13a 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,8 @@ export CPPFLAGS += -I"$(shell pwd)" endif export CXXFLAGS := -Wall -O1 +LDFLAGS := -lfl + all: $(TARGET) .PHONY: $(TARGET) diff --git a/parser/Makefile b/parser/Makefile new file mode 100644 index 0000000..d4d5b6d --- /dev/null +++ b/parser/Makefile @@ -0,0 +1,29 @@ + +FLEX := flex +BISON := bison + +PARSER := parser + +COBJS := lex.yy.o +CXXOBJS := $(PARSER).tab.o +CXXOBJS += ASTNode.o + +all: $(COBJS) $(CXXOBJS) + +%.o: %.c + $(CC) -c -o $@ $< + +%.o: %.cc + $(CXX) -c -o $@ $< + +$(PARSER).tab.cc $(PARSER).tab.hh: $(PARSER).yy + $(BISON) -d $< + +lex.yy.o: lex.yy.c + +lex.yy.c: $(PARSER).tab.hh +lex.yy.c: $(PARSER).lex + $(FLEX) $< + +clean: + -rm -f lex.yy.c $(PARSER).tab.cc $(PARSER).tab.hh *~ *.o diff --git a/parser/parser.lex b/parser/parser.lex new file mode 100644 index 0000000..ba8fca6 --- /dev/null +++ b/parser/parser.lex @@ -0,0 +1,37 @@ + +%{ +#include "parser.tab.hh" +%} + +%% +\+ return PLUS; +- return MINUS; +\* return STAR; +\/ return DIVIDE; +% return MOD; + +; return SEMICOLON; +: return COLON; +\? return QUESTION; +\$ return DOLLAR; +\. return DOT; +\" return DQUOTE; +\' return SQUOTE; +, return COMMA; + +\{ return LCURLY; +\} return RCURLY; +\[ return LBRACKET; +\] return RBRACKET; +\( return LPAREN; +\) return RPAREN; + +0b[01]+ return BIN_NUMBER; +0x[0-9A-Fa-f]+ return HEX_NUMBER; +0[0-7]* return OCT_NUMBER; +[1-9][0-9]* return DEC_NUMBER; + + +\n /* ignore newlines */ +[ \t\v] /* ignore whitespace */ +%% diff --git a/parser/parser.yy b/parser/parser.yy new file mode 100644 index 0000000..b552b24 --- /dev/null +++ b/parser/parser.yy @@ -0,0 +1,76 @@ + +%{ +#include +#include +using namespace std; + +extern "C" { + int yylex(void); +} + +extern FILE * yyin; + +void yyerror(const char * str) +{ + fprintf(stderr, "error: %s\n", str); +} + +int yywrap() +{ + return 1; +} + +%} + +%token PLUS; +%token MINUS; +%token STAR; +%token DIVIDE; +%token MOD; + +%token SEMICOLON; +%token COLON; +%token QUESTION; +%token DOLLAR; +%token DOT; +%token DQUOTE; +%token SQUOTE; +%token COMMA; + +%token LCURLY; +%token RCURLY; +%token LBRACKET; +%token RBRACKET; +%token LPAREN; +%token RPAREN; + +%token BIN_NUMBER; +%token HEX_NUMBER; +%token OCT_NUMBER; +%token DEC_NUMBER; + +%% + +program: /* empty */ + | number program { printf("Saw a number\n"); } + ; + +number: BIN_NUMBER + | OCT_NUMBER + | DEC_NUMBER + | HEX_NUMBER + ; + +%% + +int parse(const char * fileName) +{ + yyin = fopen(fileName, "r"); + if (yyin == NULL) + { + cerr << "Failed to open file '" << fileName << "'" << endl; + return -1; + } + yyparse(); +} +