]> git.mdlowis.com Git - archive/dlang.git/commitdiff
Updated syntax for macros. Macro expansion is a work in progress
authorMike D. Lowis <mike@mdlowis.com>
Fri, 2 Mar 2012 19:26:04 +0000 (14:26 -0500)
committerMike D. Lowis <mike@mdlowis.com>
Fri, 2 Mar 2012 19:26:04 +0000 (14:26 -0500)
deps/parse-utils
example.dl
source/dllexer/dllexer.h
source/dlparser/dlparser.cpp
source/dlparser/dlparser.h

index e2ccce38d3d7a0f77a0834b87912a679bcb4ed47..efe094829e9d5b499cc1ec9d22dca2f74b796210 160000 (submodule)
@@ -1 +1 @@
-Subproject commit e2ccce38d3d7a0f77a0834b87912a679bcb4ed47
+Subproject commit efe094829e9d5b499cc1ec9d22dca2f74b796210
index 94fe6ab8c17c3fe9a6db510163f1e37207b14fea..4ac171ea619b419e8623bb8c78d304c9998131d1 100644 (file)
@@ -8,3 +8,7 @@ foo = ""
 foo = "1"
 foo = "12"
 
+% if [
+    (Ex Bk) : exec_if($1, $2),
+    (Ex Bk Bk) : exec_if($1, $2, $3)
+]
index 0c3a057c9a451fc29cea47a7f2d72544c519e826..0e50a7ac5af993492093dfc238e415efb49f2fbf 100644 (file)
@@ -49,7 +49,8 @@ typedef enum TokenTypes
     BLOCK    = 43,
     FN_CALL  = 44,
     PARAMS   = 45,
-    ARRY_IDX = 46
+    ARRY_IDX = 46,
+    PATT     = 47,
 } eTokenTypes;
 
 typedef struct {
index cc4b6956faca8251ddc6ee4c45605063a487994d..90d4470b4795e6b919114513a9c8511373b1c5b0 100644 (file)
@@ -63,7 +63,7 @@ bool DLParser::speculate_GroupExpr(void)
     try
     {
         match(LPAR);
-        throw_away = LogicalExpr();
+        delete LogicalExpr();
         match(RPAR);
     }
     catch (Exception e)
@@ -100,10 +100,10 @@ AST* DLParser::Expression(void)
         match(ASSIGN);
         ret = _new AST( ASSIGN, 2, id_node, Expression());
     }
-    //else if( (lookaheadType(1) == MACRO) && (lookaheadType(2) == ID))
-    //{
-    //    ret = MacroDefinition();
-    //}
+    else if( (lookaheadType(1) == MACRO) && (lookaheadType(2) == ID))
+    {
+        ret = MacroDefinition();
+    }
     //else if( isMacro( lookaheadToken(1) ) )
     //{
     //    ret = MacroExpansion();
@@ -310,28 +310,28 @@ AST* DLParser::FuncLiteral(void)
     return ret;
 }
 
-// MacroDefinition = '%' ID '(' MacroParamList ')' '{' Expression '}'
+// MacroDefinition = '%' ID '[' MacroPatternList ']'
 AST* DLParser::MacroDefinition(void)
 {
-    AST* ret = NULL;
+    AST* macro = NULL;
     AST* id = NULL;
-    AST* params = NULL;
-    AST* body = NULL;
-    Macro* macro = NULL;
-
+    AST* patt_list = NULL;
     match(MACRO);
+
+    // Get the macro's name
     id = _new AST( ID, lookaheadToken(1).text() );
     consume();
-    match(LPAR);
-    params = MacroParamList();
-    match(RPAR);
-    match(LBRACE);
-    body = Expression();
-    match(RBRACE);
-    ret = _new AST( MACRO, 3, id, params, body );
 
-    macro = _new Macro( ret );
-    macros.insert( std::pair<std::string,Macro*>(id->text(), macro) );
+    // Parse the macro param list
+    match(LBRACK);
+    patt_list = 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;
 
     return _new AST(MACRO);
 }
@@ -352,31 +352,44 @@ AST* DLParser::MacroExpansion(void)
     return ret;
 }
 
-// MacroParamList = MacroParam (',' MacroParam)*
-AST* DLParser::MacroParamList(void)
+// MacroPatternList = MacroPattern (',' MacroPattern)*
+AST* DLParser::MacroPatternList(void)
 {
-    AST* ret = _new AST( PARAMS );
-    ret->addChild( MacroParam() );
+    AST* ret = _new AST( LIST );
+    ret->addChild( MacroPattern() );
     while(lookaheadType(1) == COMMA)
     {
         match(COMMA);
-        ret->addChild( MacroParam() );
+        ret->addChild( MacroPattern() );
     }
     return ret;
 }
 
-// MacroParam = ID (':' ID)?
-AST* DLParser::MacroParam(void)
+// MacroPattern = '(' ID+ ')' ':' LogicalExpr
+AST* DLParser::MacroPattern(void)
 {
-    AST* ret = _new AST( ID, lookaheadToken(1).text() );
-    consume();
-    if( lookaheadType(1) == SEP )
+    AST* ret = _new AST(LIST);
+
+    match(LPAR);
+    do
     {
-        match(SEP);
-        AST* type = _new AST( ID, lookaheadToken(1).text() );
+        ret->addChild( _new AST( ID, lookaheadToken(1).text() ) );
         consume();
-        ret = _new AST(SEP, 2, ret, type);
     }
+    while( lookaheadType(1) == ID );
+    match(RPAR);
+    match(SEP);
+    ret = _new AST(PATT, 2, ret, LogicalExpr());
+
+    //AST* ret = _new AST( ID, lookaheadToken(1).text() );
+    //consume();
+    //if( lookaheadType(1) == SEP )
+    //{
+    //    match(SEP);
+    //    AST* type = _new AST( ID, lookaheadToken(1).text() );
+    //    consume();
+    //    ret = _new AST(SEP, 2, ret, type);
+    //}
     return ret;
 }
 
index 51ab63ca1311e297bbfe41b280ea42b61b7479f4..96ab7d15e904b73ba8a5a8d459cb1ca385de975f 100644 (file)
@@ -62,17 +62,20 @@ class DLParser : public BTParser
         // FuncLiteral = '{' ExpBlock '}'
         //             |  '{' '|' ExpList '|' ExpBlock '}'
         //
-        // MacroDefinition = '%' ID '(' MacroParamList ')' '{' Expression '}'
+        // MacroDefinition = '%' ID '[' MacroParamList ']'
         //
-        // MacroParamList = MacroParam (',' MacroParam)*
+        // MacroPatternList = MacroPattern (',' MacroPattern)*
         //
-        // MacroParam = ID (':' ID)?
+        // MacroPattern = '(' ID+ ')' ':' LogicalExpr
         //
         // ExpList = (GroupExpr (',' GroupExpr)*)?
         //
         // ExpBlock = Expression*
     private:
+        // Entry Rules
         AST* Program(void);
+
+        // Order of Precedence rules for expressions
         AST* Expression(void);
         AST* LogicalExpr(void);
         AST* CompExpr(void);
@@ -80,14 +83,20 @@ class DLParser : public BTParser
         AST* MulDivExpr(void);
         AST* UnaryExpr(void);
         AST* GroupExpr(void);
+
+        // Literal Type Rules
         AST* Literal(void);
         AST* VectorLiteral(void);
         AST* ListLiteral(void);
         AST* FuncLiteral(void);
+
+        // Macro Rules
         AST* MacroDefinition(void);
         AST* MacroExpansion(void);
-        AST* MacroParamList(void);
-        AST* MacroParam(void);
+        AST* MacroPatternList(void);
+        AST* MacroPattern(void);
+
+        // Helper rules for lists and blocks of expressions
         AST* ExpList(TokenType_T node_type, TokenType_T terminator);
         AST* ExpBlock(TokenType_T node_type, TokenType_T terminator);
 };