У вас очень хаотичная логика.
Я думаю вам будет проще в первую очередь привести текстовый код из $prog[0] к массиву элементов.
То есть из
program {var} begin end
сделать вот это
Array
(
[0] => {
[1] => var
[2] => }
[3] => begin
[4] => end
)
После чего вы можете спокойно пройтись циклом по вышеописанному массиву и найти все лексемы.
$codeForParsing = "program {var} begin end";
$codeAsArray = textToArray($textForParsing);
$map = [];
foreach(array_unique($codeAsArray) as $codeItem) {
if (isset($map[$codeItem]))
continue;
foreach($outp as $group => $groupItems) {
if (($finded = array_search($codeItem, $groupItems)) !== false) {
$map[$codeItem] = [$group, $finded];
}
}
}
$result = [];
foreach($codeAsArray as $codeItem) {
$result[] = [$codeItem, $map[$codeItem][0], $map[$codeItem][1]];
}
В итоге вы получите массив вида
[
['{', 'ogran', индексЛексемы]
['var', 'oper', индексЛексемы],
['}', 'ogran', индексЛексемы],
....
]
который вы уже легко сможете привести к нужному виду