43 lines
839 B
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;
|
|
}
|
|
}
|