-foo = ()
-foo = (1)
-foo = (1,2)
+#------------------------------------------------------------------------------
+# Literals
+#------------------------------------------------------------------------------
+
+# VectorLiteral
foo = []
foo = [1]
-foo = [1,2]
-foo = ""
-foo = "1"
-foo = "12"
-
-% if [
- (Ex Bk) : exec_if($1, $2),
- (Ex Bk Bk) : exec_if($1, $2, $3)
-]
+foo = [1,2,3]
+foo = foo[1]
+foo = [1,2,3,4,5][2]
+
+# ListLiteral
+foo = ()
+foo = (1,2,3)
+foo = foo[1]
+foo = (1,2,3,4,5)[2]
+
+# FuncLiteral
+foo = { 1 + 1 }
+foo = {|a| a + 1}
+foo = {|a,b| a + b }
+foo = foo(1,2)
+foo = ({|a,b| a + b })(1,2)
+
+# ID
+foo = bar
+foo.bar = bar
+
+# NUM
+foo = 1
+foo = 1.0
+
+# CHAR
+foo = 'a'
+
+# STRING
+foo = "some string"
+foo = "12345"[2]
+
+# SYMBOL
+foo = $some_symbol
+
+#% if [
+# (Ex Bk) : exec_if($1, $2),
+# (Ex Bk Bk) : exec_if($1, $2, $3)
+#]
bool DLParser::speculate_GroupExpr(void)
{
- AST* throw_away = NULL;
bool success = true;
mark();
}
release();
- if (throw_away != NULL)
+ return success;
+}
+
+bool DLParser::speculate_MapLiteral(void)
+{
+ bool success = true;
+
+ mark();
+ try
+ {
+ delete MapLiteral();
+ }
+ catch (Exception e)
{
- delete throw_away;
+ success = false;
}
+ release();
return success;
}
AST* DLParser::Expression(void)
{
AST* ret = NULL;
- if((lookaheadType(1) == ID) && (lookaheadType(2) == ASSIGN))
- {
- AST* id_node = _new AST( ID,(char*)(lookaheadToken(1).text().c_str()) );
- consume();
- match(ASSIGN);
- ret = _new AST( ASSIGN, 2, id_node, Expression());
- }
- else if( (lookaheadType(1) == MACRO) && (lookaheadType(2) == ID))
+
+ if( (lookaheadType(1) == MACRO) && (lookaheadType(2) == ID))
{
ret = MacroDefinition();
}
//}
else
{
- ret = LogicalExpr();
+ ret = AssignExpr();
+ }
+ return ret;
+}
+
+AST* DLParser::AssignExpr(void)
+{
+ AST* ret = NULL;
+ ret = LogicalExpr();
+ if(lookaheadType(1) == ASSIGN)
+ {
+ match(ASSIGN);
+ ret = new AST(ASSIGN, 2, ret, LogicalExpr());
}
return ret;
}
}
else
{
- ret = Literal();
+ ret = MemberExpr();
}
if( lookaheadType(1) == LPAR )
return ret;
}
+AST* DLParser::MemberExpr(void)
+{
+ AST* ret = NULL;
+ ret = Literal();
+ if ( lookaheadType(1) == MEMB )
+ {
+ match(MEMB);
+ ret = new AST(MEMB, 2, ret, LogicalExpr());
+ }
+ return ret;
+}
+
AST* DLParser::Literal(void)
{
AST* node = NULL;
- switch(lookaheadType(1))
+ if(speculate_MapLiteral())
+ {
+ node = MapLiteral();
+ }
+ else
{
- // Literal = VectorLiteral
- case LBRACK:
- node = VectorLiteral();
- break;
-
- // Literal = ListLiteral
- case LPAR:
- node = ListLiteral();
- break;
-
- // Literal = FuncLiteral
- case LBRACE:
- node = FuncLiteral();
- break;
-
- // Literal = ID
- case ID:
- node = _new AST( ID, lookaheadToken(1).text() );
- consume();
- break;
-
- // Literal = NUM
- case NUM:
- node = _new AST( NUM, lookaheadToken(1).text() );
- consume();
- break;
-
- // Literal = CHAR
- case CHAR:
- node = _new AST( CHAR, lookaheadToken(1).text() );
- consume();
- break;
-
- // Literal = STRING
- case STRING:
- node = _new AST( STRING, lookaheadToken(1).text() );
- consume();
- break;
-
- // Literal = SYMBOL
- case SYMBOL:
- node = _new AST( SYMBOL, lookaheadToken(1).text() );
- consume();
- break;
-
- default:
- Token& tok = lookaheadToken(1);
- ostringstream oss;
- oss << "Expected literal type, recieved type " << tok.type() << ".";
- Exception ex( tok.line(), tok.column() );
- ex.setMessage(oss.str());
- throw ex;
+ switch(lookaheadType(1))
+ {
+ // Literal = VectorLiteral
+ case LBRACK:
+ node = VectorLiteral();
+ break;
+
+ // Literal = ListLiteral
+ case LPAR:
+ node = ListLiteral();
+ break;
+
+ // Literal = FuncLiteral
+ case LBRACE:
+ node = FuncLiteral();
+ break;
+
+ // Literal = ID
+ case ID:
+ node = _new AST( ID, lookaheadToken(1).text() );
+ consume();
+ break;
+
+ // Literal = NUM
+ case NUM:
+ node = _new AST( NUM, lookaheadToken(1).text() );
+ consume();
+ break;
+
+ // Literal = CHAR
+ case CHAR:
+ node = _new AST( CHAR, lookaheadToken(1).text() );
+ consume();
+ break;
+
+ // Literal = STRING
+ case STRING:
+ node = _new AST( STRING, lookaheadToken(1).text() );
+ consume();
+ break;
+
+ // Literal = SYMBOL
+ case SYMBOL:
+ node = _new AST( SYMBOL, lookaheadToken(1).text() );
+ consume();
+ break;
+
+ default:
+ Token& tok = lookaheadToken(1);
+ ostringstream oss;
+ oss << "Expected literal type, recieved type " << tok.type() << ".";
+ Exception ex( tok.line(), tok.column() );
+ ex.setMessage(oss.str());
+ throw ex;
+ }
}
return node;
}
+AST* DLParser::MapLiteral(void)
+{
+ AST* ret = NULL;
+ throw Exception(lookaheadToken(1).line(), lookaheadToken(1).column());
+ return ret;
+}
+
AST* DLParser::VectorLiteral(void)
{
AST* ret = NULL;
AST* parse(void);
bool isMacro(Token& token);
bool speculate_GroupExpr(void);
+ bool speculate_MapLiteral(void);
/**********************************************************************
* EBNF Syntax Grammar
// | $MacroExpansion$
// | LogicalExpr
//
+ // AssignExpr = LogicalExpr '=' LogicalExpr
+ //
// LogicalExpr = CompExpr (('&&' | '||') CompExpr)*
//
// CompExpr = AddSubExpr (('==' | '!=' | '<' | '>' | '<=' | '>=') AddSubExpr)*
// | Literal '(' ExpList ')'
// | Literal '[' LogicalExpr ']'
//
+ // MemberExpr = Literal '.' LogicalExpr
+ //
// Literal = VectorLiteral
// | ListLiteral
// | FuncLiteral
// Order of Precedence rules for expressions
AST* Expression(void);
+ AST* AssignExpr(void);
AST* LogicalExpr(void);
AST* CompExpr(void);
AST* AddSubExpr(void);
AST* MulDivExpr(void);
AST* UnaryExpr(void);
AST* GroupExpr(void);
+ AST* MemberExpr(void);
// Literal Type Rules
AST* Literal(void);
+ AST* MapLiteral(void);
AST* VectorLiteral(void);
AST* ListLiteral(void);
AST* FuncLiteral(void);