From 916982168cf12d4a49a87f6975b9599f1457ffef Mon Sep 17 00:00:00 2001 From: "Mike D. Lowis" Date: Tue, 6 Mar 2012 13:20:31 -0500 Subject: [PATCH] Converted macro rules to create macros and patterns rather than ASTs --- source/dlparser/dlparser.cpp | 49 ++++++++++++++++----------------- source/dlparser/dlparser.h | 10 +++---- source/dlparser/macro/macro.cpp | 10 +++++++ source/dlparser/macro/macro.h | 15 ++++++++++ source/main.cpp | 1 + 5 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 source/dlparser/macro/macro.cpp create mode 100644 source/dlparser/macro/macro.h diff --git a/source/dlparser/dlparser.cpp b/source/dlparser/dlparser.cpp index 3b2e0ac..f6fd6c3 100644 --- a/source/dlparser/dlparser.cpp +++ b/source/dlparser/dlparser.cpp @@ -8,10 +8,6 @@ DLParser::DLParser() : BTParser(_new DLLexer()) DLParser::~DLParser() { - std::map::iterator iter; - for (iter = macros.begin(); iter != macros.end(); ++iter) { - delete (iter->second); - } } AST* DLParser::parse(void) @@ -289,7 +285,6 @@ AST* DLParser::MapLiteral(void) { AST* ret = NULL; - //throw Exception(lookaheadToken(1).line(),lookaheadToken(1).column()); match(LBRACE); do { @@ -349,59 +344,61 @@ AST* DLParser::FuncLiteral(void) // MacroDefinition = '%' ID '[' MacroPatternList ']' AST* DLParser::MacroDefinition(void) { - AST* macro = NULL; - AST* id = NULL; - AST* patt_list = NULL; + std::list patterns; + std::string name; + match(MACRO); // Get the macro's name - id = _new AST( ID, lookaheadToken(1).text() ); - consume(); + name = lookaheadToken(1).text(); + match(ID); // Parse the macro param list match(LBRACK); - patt_list = MacroPatternList(); + patterns = MacroPatternList(); match(RBRACK); // Build and register the macro - macro = _new AST(MACRO,2,id,patt_list); - //macros.insert( std::pair(id->text(), macro) ); - - delete macro; + macros.insert( std::pair(name, Macro(patterns)) ); return _new AST(MACRO); } // MacroPatternList = MacroPattern (',' MacroPattern)* -AST* DLParser::MacroPatternList(void) +std::list DLParser::MacroPatternList(void) { - AST* ret = _new AST( LIST ); - ret->addChild( MacroPattern() ); + std::list patterns; + + patterns.push_back( MacroPattern() ); while(lookaheadType(1) == COMMA) { match(COMMA); - ret->addChild( MacroPattern() ); + patterns.push_back( MacroPattern() ); } - return ret; + + return patterns; } // MacroPattern = '(' ID+ ')' ':' LogicalExpr -AST* DLParser::MacroPattern(void) +Pattern DLParser::MacroPattern(void) { - AST* ret = _new AST(LIST); + AST* expr = NULL; + std::list pattern; match(LPAR); do { - ret->addChild( _new AST( ID, lookaheadToken(1).text() ) ); - consume(); + std::string text = lookaheadToken(1).text(); + match(ID); + //pattern.push_back( str_to_patt_type(text) ); + pattern.push_back( EXPR_TYP ); } while( lookaheadType(1) == ID ); match(RPAR); match(SEP); - ret = _new AST(PATT, 2, ret, LogicalExpr()); + expr = LogicalExpr(); - return ret; + return Pattern( pattern, expr ); } // ExpList = (Expression (',' Expression)*)? diff --git a/source/dlparser/dlparser.h b/source/dlparser/dlparser.h index 8fca4ff..d011f7a 100644 --- a/source/dlparser/dlparser.h +++ b/source/dlparser/dlparser.h @@ -4,13 +4,13 @@ #include #include "btparser.h" #include "dllexer.h" - -class Macro{}; +#include "macro.h" class DLParser : public BTParser { private: - std::map macros; + std::map macros; + std::map pattern_types; public: DLParser(); ~DLParser(); @@ -101,8 +101,8 @@ class DLParser : public BTParser // Macro Rules AST* MacroDefinition(void); - AST* MacroPatternList(void); - AST* MacroPattern(void); + std::list MacroPatternList(void); + Pattern MacroPattern(void); // Helper rules for lists and blocks of expressions AST* ExpList(TokenType_T node_type, TokenType_T terminator); diff --git a/source/dlparser/macro/macro.cpp b/source/dlparser/macro/macro.cpp new file mode 100644 index 0000000..db05bab --- /dev/null +++ b/source/dlparser/macro/macro.cpp @@ -0,0 +1,10 @@ +#include "macro.h" + +Macro::Macro(const std::list& patts) : patterns(patts) +{ +} + +Macro::~Macro() +{ +} + diff --git a/source/dlparser/macro/macro.h b/source/dlparser/macro/macro.h new file mode 100644 index 0000000..bb5c36c --- /dev/null +++ b/source/dlparser/macro/macro.h @@ -0,0 +1,15 @@ +#ifndef MACRO_H +#define MACRO_H + +#include +#include "pattern.h" + +class Macro { + private: + std::list patterns; + public: + Macro(const std::list& patts); + ~Macro(); +}; + +#endif diff --git a/source/main.cpp b/source/main.cpp index 0493636..35a4614 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -6,6 +6,7 @@ #include "astprinter.h" #include "scheme.h" #include "cork.h" +#include "macro.h" using namespace std; -- 2.49.0