]> git.mdlowis.com Git - archive/dlang.git/commitdiff
Converted macro rules to create macros and patterns rather than ASTs
authorMike D. Lowis <mike@mdlowis.com>
Tue, 6 Mar 2012 18:20:31 +0000 (13:20 -0500)
committerMike D. Lowis <mike@mdlowis.com>
Tue, 6 Mar 2012 18:20:31 +0000 (13:20 -0500)
source/dlparser/dlparser.cpp
source/dlparser/dlparser.h
source/dlparser/macro/macro.cpp [new file with mode: 0644]
source/dlparser/macro/macro.h [new file with mode: 0644]
source/main.cpp

index 3b2e0aca05886553e56123b3fb3f9ff3dddc04b8..f6fd6c345cd7988c3d6cca695a1fe34fc8004487 100644 (file)
@@ -8,10 +8,6 @@ DLParser::DLParser() : BTParser(_new DLLexer())
 
 DLParser::~DLParser()
 {
-    std::map<std::string,Macro*>::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<Pattern> 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<std::string,Macro*>(id->text(), macro) );
-
-    delete macro;
+    macros.insert( std::pair<std::string,Macro>(name, Macro(patterns)) );
 
     return _new AST(MACRO);
 }
 
 // MacroPatternList = MacroPattern (',' MacroPattern)*
-AST* DLParser::MacroPatternList(void)
+std::list<Pattern> DLParser::MacroPatternList(void)
 {
-    AST* ret = _new AST( LIST );
-    ret->addChild( MacroPattern() );
+    std::list<Pattern> 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<PatternType_T> 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)*)?
index 8fca4ff9bbab380e98b9b8ae66d497883c561de9..d011f7adcacdb8c83be642eaa88ded9d05a02533 100644 (file)
@@ -4,13 +4,13 @@
 #include <map>
 #include "btparser.h"
 #include "dllexer.h"
-
-class Macro{};
+#include "macro.h"
 
 class DLParser : public BTParser
 {
     private:
-        std::map<std::string,Macro*> macros;
+        std::map<std::string,Macro> macros;
+        std::map<std::string,PatternType_T> 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<Pattern> 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 (file)
index 0000000..db05bab
--- /dev/null
@@ -0,0 +1,10 @@
+#include "macro.h"
+
+Macro::Macro(const std::list<Pattern>& patts) : patterns(patts)
+{
+}
+
+Macro::~Macro()
+{
+}
+
diff --git a/source/dlparser/macro/macro.h b/source/dlparser/macro/macro.h
new file mode 100644 (file)
index 0000000..bb5c36c
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef MACRO_H
+#define MACRO_H
+
+#include <list>
+#include "pattern.h"
+
+class Macro {
+    private:
+        std::list<Pattern> patterns;
+    public:
+        Macro(const std::list<Pattern>& patts);
+        ~Macro();
+};
+
+#endif
index 0493636080493f396783be9ff22c96ca1bc89d42..35a461436cd3fb281202fdf3a4c2eb37e518b198 100644 (file)
@@ -6,6 +6,7 @@
 #include "astprinter.h"
 #include "scheme.h"
 #include "cork.h"
+#include "macro.h"
 
 using namespace std;