dok2d
@dok2d
Сисадмин, делаю сайты разной паршивости

Как грамотно проанализировать?

Есть массив $outp примерно такого вида:

Array
(
    [stolb1] => Array
        (
            [0] => program
            [1] => var
            [2] => begin
            [3] => end
            [4] => ass
            [5] => if
        )

    [stolb2] => Array
        (
            [0] => {
            [1] => }
            [2] => ;
            [3] => .
            [4] => ,
            [5] => (
            [6] => )
        )

    [stolb3] => Array
        (
            [0] => -651464
            [1] => 16941
            [2] => 0111001101
            [3] => 35647
        )

    [stolb4] => Array
        (
            [0] => int
            [1] => a
            [2] => b
            [3] => c
            [4] => d
        )

)


И ещё элемент массива $prog[0]примерно такого содержания:

program var int a,b,c
begin a ass -651464
b ass +16941
c ass 0111001101
d ass +35647
end.


Каким образом можно произвести поиск в $prog[0] совпадающих элементов с $outp и последующим добавлением "координат найденного совпадения" к каждому слову, чтобы вышло таким образом в $output?

program(stolb1,0) var(stolb1,1) int(stolb4,0) a(stolb4,1),(stolb2,4)b(stolb4,2),(stolb2,4)c(stolb4,3)
begin(stolb1,2) a(stolb4,1) ass(stolb1,4) -651464(stolb3,0)
b(stolb4,2) ass(stolb1,4) +16941(stolb3,1)
c(stolb4,3) ass(stolb1,4) 0111001101 (stolb3,2)
d(stolb4,4) ass(stolb1,4) +35647(stolb3,3)
end(stolb1,3).(stolb2,3)
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
serieznyi
@serieznyi
Backend Developer
У вас очень хаотичная логика.
Я думаю вам будет проще в первую очередь привести текстовый код из $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', индексЛексемы],
....
]


который вы уже легко сможете привести к нужному виду
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы