From 9a11b5a5ad95afc16fb3963702be2439225f2e38 Mon Sep 17 00:00:00 2001 From: "Mike D. Lowis" Date: Fri, 2 Mar 2012 14:26:04 -0500 Subject: [PATCH] Updated syntax for macros. Macro expansion is a work in progress --- deps/parse-utils | 2 +- example.dl | 4 ++ source/dllexer/dllexer.h | 3 +- source/dlparser/dlparser.cpp | 79 +++++++++++++++++++++--------------- source/dlparser/dlparser.h | 19 ++++++--- 5 files changed, 67 insertions(+), 40 deletions(-) diff --git a/deps/parse-utils b/deps/parse-utils index e2ccce3..efe0948 160000 --- a/deps/parse-utils +++ b/deps/parse-utils @@ -1 +1 @@ -Subproject commit e2ccce38d3d7a0f77a0834b87912a679bcb4ed47 +Subproject commit efe094829e9d5b499cc1ec9d22dca2f74b796210 diff --git a/example.dl b/example.dl index 94fe6ab..4ac171e 100644 --- a/example.dl +++ b/example.dl @@ -8,3 +8,7 @@ foo = "" foo = "1" foo = "12" +% if [ + (Ex Bk) : exec_if($1, $2), + (Ex Bk Bk) : exec_if($1, $2, $3) +] diff --git a/source/dllexer/dllexer.h b/source/dllexer/dllexer.h index 0c3a057..0e50a7a 100644 --- a/source/dllexer/dllexer.h +++ b/source/dllexer/dllexer.h @@ -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 { diff --git a/source/dlparser/dlparser.cpp b/source/dlparser/dlparser.cpp index cc4b695..90d4470 100644 --- a/source/dlparser/dlparser.cpp +++ b/source/dlparser/dlparser.cpp @@ -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(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(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; } diff --git a/source/dlparser/dlparser.h b/source/dlparser/dlparser.h index 51ab63c..96ab7d1 100644 --- a/source/dlparser/dlparser.h +++ b/source/dlparser/dlparser.h @@ -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); }; -- 2.49.0