From 741ca57e11357ad664f2fd5d1cada05c6535a3f2 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 29 Sep 2010 21:33:22 +0000 Subject: [PATCH] added assignment expressions, for loop nodes, boolean expressions, ForNode class, BoolExpressionNode class, AssignmentNode class git-svn-id: svn://anubis/fart/branches/scene-file-scripting@326 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- parser/nodes.cc | 26 +++++++++++++++ parser/nodes.h | 39 ++++++++++++++++++++++ parser/parser.lex | 10 ++++++ parser/parser.yy | 83 ++++++++++++++++++++++++++++++++++------------- 4 files changed, 136 insertions(+), 22 deletions(-) diff --git a/parser/nodes.cc b/parser/nodes.cc index 7af3eca..e073c05 100644 --- a/parser/nodes.cc +++ b/parser/nodes.cc @@ -44,3 +44,29 @@ double BinOpNode::getNumber() exit(-3); } } + +int BoolExpressionNode::getInteger() +{ + double o, t; + if (m_op != '!') + { + o = one->getNumber(); + t = two->getNumber(); + } + switch (m_op) + { + case '<': + return o < t; + case '>': + return o > t; + case '=': + return o == t; + case 'n': + return o != t; + case '!': + return ! one->getInteger(); + case 'T': + return 1; + } + return 0; +} diff --git a/parser/nodes.h b/parser/nodes.h index 5d63aa2..7e76233 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -425,6 +425,20 @@ class ExpressionNode : public Node virtual int getInteger() { return getNumber(); } }; +class AssignmentNode : public ExpressionNode +{ + public: + AssignmentNode(refptr varref, refptr expr) + : m_varref(varref), m_expr(expr) + { + } + std::string getString() { return m_varref->getString(); } + double getNumber() { return m_expr->getNumber(); } + protected: + refptr m_varref; + refptr m_expr; +}; + class BinOpNode : public ExpressionNode { public: @@ -439,6 +453,20 @@ class BinOpNode : public ExpressionNode refptr two; }; +class BoolExpressionNode : public Node +{ + public: + BoolExpressionNode(char op, refptr one, refptr two) + : m_op(op), one(one), two(two) + { + } + int getInteger(); + protected: + char m_op; + refptr one; + refptr two; +}; + class VarRefNode : public Node { public: @@ -448,5 +476,16 @@ class VarRefNode : public Node std::string m_string; }; +class ForNode : public Node +{ + public: + ForNode(refptr e1, refptr e2, refptr e3) + : m_e1(e1), m_e2(e2), m_e3(e3) + { + } + protected: + refptr m_e1, m_e2, m_e3; +}; + #endif diff --git a/parser/parser.lex b/parser/parser.lex index ba08110..a52d888 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -17,6 +17,10 @@ \* return TIMES; \/ return DIVIDE; % return MOD; +:= return ASSIGN; += return EQUALS; +!= return NOTEQUALS; +! return NOT; ; return SEMICOLON; : return COLON; @@ -81,6 +85,12 @@ up return UP; vfov return VFOV; width return WIDTH; +else return ELSE; +elsif return ELSIF; +for return FOR; +if return IF; +while return WHILE; + [a-zA-Z_][a-zA-Z_0-9]* { *yylval = new IdentifierNode(yytext); return IDENTIFIER; diff --git a/parser/parser.yy b/parser/parser.yy index 64a38ef..2372e9a 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -36,6 +36,10 @@ static refptr parsed_scene_node; %token TIMES; %token DIVIDE; %token MOD; +%token ASSIGN; +%token EQUALS; +%token NOTEQUALS; +%token NOT; %token SEMICOLON; %token COLON; @@ -103,6 +107,13 @@ static refptr parsed_scene_node; %token IDENTIFIER; %token VARREF; +%token ELSE; +%token ELSIF; +%token FOR; +%token IF; +%token WHILE; + +%right ASSIGN %left PLUS MINUS %left TIMES DIVIDE %left UMINUS @@ -218,6 +229,21 @@ extrude_item: polygon { $$ = $1; } | shape_item { $$ = $1; } ; +general_items: /* empty */ + | general_item general_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } + ; + +general_item: transform_block { $$ = $1; } + | material_definition { $$ = $1; } + | shape_definition { $$ = $1; } + | shape { $$ = $1; } + | for { $$ = $1; } + ; + intersect: INTERSECT LCURLY bool_items RCURLY { $$ = new IntersectNode(); $$->addChildren($3); @@ -437,12 +463,9 @@ scene_items: /* empty */ ; scene_item: camera { $$ = $1; } - | shape { $$ = $1; } - | options { $$ = $1; } | light { $$ = $1; } - | transform_block { $$ = $1; } - | material_definition { $$ = $1; } - | shape_definition { $$ = $1; } + | options { $$ = $1; } + | general_item { $$ = $1; } ; shape: plane { $$ = $1; } @@ -523,37 +546,24 @@ transform: TRANSLATE vector3 { } ; -transform_block: TRANSLATE vector3 LCURLY transform_block_items RCURLY { +transform_block: TRANSLATE vector3 LCURLY general_items RCURLY { $$ = new TranslateBlockNode($2); $$->addChildren($4); } - | ROTATE expression COMMA vector3 LCURLY transform_block_items RCURLY { + | ROTATE expression COMMA vector3 LCURLY general_items RCURLY { $$ = new RotateBlockNode($2, $4); $$->addChildren($6); } - | SCALE vector3 LCURLY transform_block_items RCURLY { + | SCALE vector3 LCURLY general_items RCURLY { $$ = new ScaleBlockNode($2); $$->addChildren($4); } - | SCALE expression LCURLY transform_block_items RCURLY { + | SCALE expression LCURLY general_items RCURLY { $$ = new ScaleBlockNode(new VectorNode($2, $2, $2)); $$->addChildren($4); } ; -transform_block_items: /* empty */ - | transform_block_item transform_block_items { - $$ = new ItemsNode(); - $$->addChild($1); - $$->addChildren($2); - } - ; - -transform_block_item: transform_block { $$ = $1; } - | shape { $$ = $1; } - | shape_definition { $$ = $1; } - ; - union: UNION LCURLY bool_items RCURLY { $$ = new UnionNode(); $$->addChildren($3); @@ -576,8 +586,26 @@ expression: term { $$ = $1; } | MINUS expression %prec UMINUS { $$ = new BinOpNode('-', new NumberNode(0.0), $2); } + | assignment { $$ = $1; } ; +bool_expression: expression LESS expression { + $$ = new BoolExpressionNode('<', $1, $3); + } + | expression GREATER expression { + $$ = new BoolExpressionNode('>', $1, $3); + } + | expression EQUALS expression { + $$ = new BoolExpressionNode('=', $1, $3); + } + | expression NOTEQUALS expression { + $$ = new BoolExpressionNode('n', $1, $3); + } + | NOT bool_expression { + $$ = new BoolExpressionNode('!', $2, NULL); + } + ; + term: factor { $$ = $1; } | term PLUS factor { $$ = new BinOpNode('+', $1, $3); } | term MINUS factor { $$ = new BinOpNode('-', $1, $3); } @@ -588,6 +616,17 @@ factor: number { $$ = $1; } | LPAREN expression RPAREN { $$ = $2; } ; +assignment: VARREF ASSIGN expression { + $$ = new AssignmentNode($1, $3); + } + ; + +for: FOR LPAREN expression SEMICOLON bool_expression SEMICOLON expression RPAREN LCURLY general_items RCURLY { + $$ = new ForNode($3, $5, $7); + $$->addChildren($10); + } + ; + %% refptr parse(const char * fileName)