Пример #1
0
 /**
  * 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());
 }