/** * Creates the grammar. */ public function __construct() { parent::__construct(); // Note: unary +/- operators must have higher precedence as all binary operators // http://www.antlr.org/pipermail/antlr-dev/2009-April/002255.html $this->addOperator(new UnaryOperator(Lexer::T_PLUS, 5, function ($node) { return new UnaryPosNode($node); })); $this->addOperator(new UnaryOperator(Lexer::T_MINUS, 5, function ($node) { return new UnaryNegNode($node); })); $this->addOperator(new TernaryOperator(Lexer::T_QUESTION_MARK, Lexer::T_COLON, 1, TernaryOperator::RIGHT, true, function ($condition, $if, $else) { return new TernaryIfNode($condition, $if, $else); })); $this->addOperator(new BinaryOperator(Lexer::T_PLUS, 2, BinaryOperator::LEFT, function ($left, $right) { return new BinaryAddNode($left, $right); })); $this->addOperator(new BinaryOperator(Lexer::T_MINUS, 2, BinaryOperator::LEFT, function ($left, $right) { return new BinarySubNode($left, $right); })); $this->addOperator(new BinaryOperator(Lexer::T_MUL, 3, BinaryOperator::LEFT, function ($left, $right) { return new BinaryMulNode($left, $right); })); $this->addOperator(new BinaryOperator(Lexer::T_DIV, 3, BinaryOperator::LEFT, function ($left, $right) { return new BinaryDivNode($left, $right); })); $this->addOperator(new BinaryOperator(Lexer::T_MOD, 3, BinaryOperator::LEFT, function ($left, $right) { return new BinaryModNode($left, $right); })); $this->addOperator(new BinaryOperator(Lexer::T_POWER, 4, BinaryOperator::RIGHT, function ($left, $right) { return new BinaryPowerNode($left, $right); })); $this->addOperand(new NumberOperand()); $this->addOperand(new ParenthesesOperand()); }