philips-cnc6600-interpreter/src/Program/Builder/ProgramBuilder.php

43 lines
839 B
PHP

<?php
namespace Program\Builder;
use Program\Block;
use Program\Program;
use Program\Word;
use RuntimeException;
class ProgramBuilder
{
/**
* @param Word[] $words
* @return Program
*/
public function build(array $words): Program
{
$firstWord = array_shift($words);
if (!preg_match('/^N9\d\d\d$/i', $firstWord)) {
throw new RuntimeException('Expected program number (N9xxx), got ' . $firstWord);
}
$program = new Program($firstWord->value);
$blockBuffer = null;
while ($word = array_shift($words)) {
if ($word->register === 'N') {
if (!is_null($blockBuffer)) {
$program->addBlock($blockBuffer);
}
$blockBuffer = new Block($word->value);
continue;
}
$blockBuffer->addWord($word);
}
if (!is_null($blockBuffer)) {
$program->addBlock($blockBuffer);
}
return $program;
}
}