Как Вы проанализировали бы добавление отступа (стиль Python)?

Вы можете использовать array_search , чтобы проверить, существует ли индекс на дату, и использовать тот же индекс для счетчика в Fresh_Record:

 "2019-01-17",
  1 => "2019-01-16",
  2 => "2019-01-15",
  3 => "2019-01-14",
  4 => "2019-01-13",
  5 => "2019-01-12",
  6 => "2019-01-11",
  7 => "2019-01-10"
];

$Fresh_Record =  [
    "date" =>  [
        0 => "2019-01-10",
        1 => "2019-01-14"
    ],
    "counter" =>  [
        0 => 1000.0,
        1 => 500.0
    ]
];

foreach($dates as $date){
    $map_array['date'][] = $date;
    $index = array_search($date, $Fresh_Record['date']);
    if($index !== false){
        $map_array['counter'][] = $Fresh_Record['counter'][$index];
    } else {
        $map_array['counter'][] = 0;
    }
}

print_r($map_array);

Будет выводить:

Array
(
    [date] => Array
        (
            [0] => 2019-01-17
            [1] => 2019-01-16
            [2] => 2019-01-15
            [3] => 2019-01-14
            [4] => 2019-01-13
            [5] => 2019-01-12
            [6] => 2019-01-11
            [7] => 2019-01-10
        )

    [counter] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 500
            [4] => 0
            [5] => 0
            [6] => 0
            [7] => 1000
        )

)

9
задан Community 23 May 2017 в 12:04
поделиться

2 ответа

Это довольно гипотетически, поскольку это зависело бы, на какой технологии Вы имеете для своего лексического анализатора и синтаксического анализатора, но самый легкий путь, казалось бы, был бы, чтобы иметь BEGINBLOCK и маркеры ENDBLOCK, аналогичные фигурным скобкам в C. Используя "внеплощадочное правило" Ваш лексический анализатор должен отслеживать стопку indendtation уровней. Когда уровень отступа увеличится, испустите BEGINBLOCK для синтаксического анализатора; когда уровень отступа уменьшается, испустите ENDBLOCK, и поп выравнивает стек.

Вот другое обсуждение этого на Так, btw.

10
ответ дан 4 December 2019 в 20:25
поделиться

Также можно отследить где-нибудь в лексическом анализаторе, сколько ident объектов предшествует первой строке и передает ее синтаксическому анализатору. Самая интересная часть попыталась бы передать его синтаксическому анализатору правильно :) Если Ваш синтаксический анализатор использует предвидение (здесь, я подразумеваю, что синтаксический анализатор может запросить для переменного количества маркеров перед ним действительно собирающийся соответствовать даже одному), затем пытающийся передать это через одну глобальную переменную, кажется, очень плохая идея (потому что лексический анализатор может поскользнуться на следующей строке и изменить значение счетчика отступа, в то время как синтаксический анализатор все еще пытается проанализировать предыдущую строку). Также globals являются злыми во многих других случаях ;) При отмечании первой строки 'реальный' маркер в некоторым образом со счетчиком отступа более разумен. Я не могу дать Вам точный пример (я даже не знаю то, что синтаксический анализатор и генераторы лексического анализатора - Вы собирающийся использовать, если любой...), но что-то как то, чтобы хранить данные на первых маркерах строки (это могло бы быть не удобно, если Вы не можете легко получить такой маркер из синтаксического анализатора) или сохранении пользовательских данных (карта, которая связывает маркеры, чтобы расположить с отступом, выстроить, где каждая строка в исходном коде как индекс и значение отступа как значение элемента), кажется, достаточно. Одна оборотная сторона этого подхода является дополнительной сложностью к синтаксическому анализатору, который должен будет различать значения ident и изменить его поведение на основе его. Что-то как ПРЕДВИДЕНИЕ ({yourConditionInJava}) для JavaCC может работать здесь, но это не очень хорошая идея. Много дополнительных маркеров в Вашем подходе, кажется, менее злая вещь использовать :)

Поскольку другая альтернатива, которую я предложил бы, должна смешать это два подхода. Вы могли генерировать дополнительные маркеры только, когда счетчик отступа изменяет свое значение на следующей строке. Это похоже искусственно, НАЧИНАЮТ и ЗАКАНЧИВАЮТ маркер. Таким образом можно понизить количество 'искусственных' маркеров в потоке, питаемом в синтаксический анализатор из лексического анализатора. Только Ваша грамматика синтаксического анализатора должна быть скорректирована для понимания дополнительных маркеров...

Я не сделал попробовал это (не имейте никакого реального опыта с таким парсингом языков), просто совместно использовав мои мысли о возможных решениях. При проверке уже созданных синтаксических анализаторов на это виды языков могли иметь большую ценность для Вас. Открытый исходный код является Вашим другом ;)

1
ответ дан 4 December 2019 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: