From 4e3ce00056c391964410be819a72c75a163f25e0 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 8 Oct 2010 01:59:30 +0000 Subject: [PATCH] reworked expressions to implement precedence properly git-svn-id: svn://anubis/fart/trunk@367 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- parser/parser.yy | 28 +++++++++++----------------- scenes/dw-circle.fart | 2 -- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/parser/parser.yy b/parser/parser.yy index d47a941..f99332c 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -355,16 +355,20 @@ vector3: LESS expression COMMA expression COMMA expression GREATER { } ; -expression: term { $$ = $1; } - | expression TIMES term { $$ = new BinOpNode('*', $1, $3); } - | expression DIVIDE term { $$ = new BinOpNode('/', $1, $3); } - | expression MOD term { $$ = new BinOpNode('%', $1, $3); } - | expression POW term { $$ = new BinOpNode('^', $1, $3); } +expression: expression TIMES expression { $$ = new BinOpNode('*', $1, $3); } + | expression DIVIDE expression { $$ = new BinOpNode('/', $1, $3); } + | expression PLUS expression { $$ = new BinOpNode('+', $1, $3); } + | expression MINUS expression { $$ = new BinOpNode('-', $1, $3); } + | expression MOD expression { $$ = new BinOpNode('%', $1, $3); } + | expression POW expression { $$ = new BinOpNode('^', $1, $3); } | MINUS expression %prec UMINUS { $$ = new BinOpNode('-', new NumberNode(0.0), $2); } - | stmt_expression { $$ = $1; } - | function_call { $$ = $1; } + | stmt_expression { $$ = $1; } + | function_call { $$ = $1; } + | number { $$ = $1; } + | VARREF { $$ = $1; } + | LPAREN expression RPAREN { $$ = $2; } ; maybe_expression: /* empty */ @@ -405,16 +409,6 @@ bool_expression: expression LESS expression { } ; -term: factor { $$ = $1; } - | term PLUS factor { $$ = new BinOpNode('+', $1, $3); } - | term MINUS factor { $$ = new BinOpNode('-', $1, $3); } - ; - -factor: number { $$ = $1; } - | VARREF { $$ = $1; } - | LPAREN expression RPAREN { $$ = $2; } - ; - assignment: VARREF ASSIGN expression { $$ = new AssignmentNode($1, $3); } diff --git a/scenes/dw-circle.fart b/scenes/dw-circle.fart index 0ae0b8f..0408914 100644 --- a/scenes/dw-circle.fart +++ b/scenes/dw-circle.fart @@ -105,8 +105,6 @@ scene light { position <100, -100, 100> - radius 0.3 - jitter 3 } plane