public function __construct($scanner, $_symTable) { parent::requireKeyword($scanner, 'case'); $scanner->next(); $this->condition = new Expression($scanner, $_symTable); parent::requireKeyword($scanner, 'of'); $scanner->next(); Globals::$switchDepth++; while (true) { if ($scanner->get()->isKeyword('else')) { $scanner->next(); $this->default = CompoundStatement::smartParse($scanner, $_symTable); parent::semicolonPass($scanner); break; } $caseCondition = new Expression($scanner, $_symTable); $caseCondition = TypeCast::tryTypeCast($caseCondition, $this->condition->symType, false); parent::requireOperator($scanner, ':'); $scanner->next(); $caseStatements = CompoundStatement::smartParse($scanner, $_symTable); $this->cases[] = ["condition" => $caseCondition, "statements" => $caseStatements]; parent::semicolonPass($scanner); if ($scanner->get()->isKeyword('end')) { break; } } Globals::$switchDepth--; parent::requireKeyword($scanner, 'end'); $scanner->next(); }
public function __construct($scanner, $_symTable) { parent::requireKeyword($scanner, 'for'); $scanner->next(); $this->counter = VariableAccess::parse($scanner, $_symTable); if (!SymSimpleType::equal($this->counter->symType, Globals::getSimpleType('integer'))) { SemanticException::raw($scanner, 'Counter must be integer'); } parent::requireOperator($scanner, ':='); $scanner->next(); $this->from = new Expression($scanner, $_symTable); $this->from = TypeCast::tryTypeCast($this->from, 'integer'); switch ($scanner->get()->getValue()) { case 'to': $this->direction = self::DIRECTION_ASC; break; case 'downto': $this->direction = self::DIRECTION_DESC; break; default: parent::simpleException($scanner, ['<KEYWORD \'to\'>', '<KEYWORD \'downto\'>']); } $scanner->next(); $this->to = new Expression($scanner, $_symTable); $this->to = TypeCast::tryTypeCast($this->to, 'integer'); parent::requireKeyword($scanner, 'do'); $scanner->next(); Globals::$loopDepth++; $this->statements = CompoundStatement::smartParse($scanner, $_symTable); Globals::$loopDepth--; }
public function __construct($scanner, $_symTable) { parent::requireKeyword($scanner, 'while'); $scanner->next(); $this->condition = new Expression($scanner, $_symTable); $this->condition = TypeCast::tryTypeCast($this->condition, 'boolean'); parent::requireKeyword($scanner, 'do'); $scanner->next(); Globals::$loopDepth++; $this->statements = CompoundStatement::smartParse($scanner, $_symTable); Globals::$loopDepth--; }