Ища четкое определение того, что “токенизатор”, “синтаксический анализатор” и “лексические анализаторы” и как они связываются друг с другом и используются?

Прежде всего, вам следует перебрать все элементы li DOM .

Вы можете сделать это, используя метод Array.from в сочетании с forEach, передав функцию обратного вызова , которая применяется для каждого элемента.

Затем проверьте, если data_total больше 0, и если это правда, просто установите свойство className для текущего элемента .

Кроме того, я создал функцию с именем checkIfChildsHaveMessages , которая проверяет, есть ли у элемента дочерние элементы, и содержит ли он хотя бы один элемент с new messages.

function checkIfChildsHaveMessages(item){
  let childrens = item.querySelectorAll('ul li');
  if(childrens.length == 0)
    return item.getAttribute('data-total') > 0;
  return Array.from(childrens).some(ch => ch.getAttribute('data-total') > 0);
}

let li = document.getElementsByTagName('li');
Array.from(li).forEach(function(item){
  data_total = item.getAttribute('data-total');
  let childsHaveMessages = checkIfChildsHaveMessages(item);
  if(data_total > 0 || childsHaveMessages)
    item.className = "new_messages";
});
console.log(document.getElementsByTagName('ul')[0].innerHTML);
<ul>
    <li data-total="0">Node 1</li>
    <li data-total="4">Node 2</li>
    <li data-total="0">Node 3
        <ul>
            <li data-total="0">sub node 1</li>
            <li data-total="0">sub node 2
                <ul>
                    <li data-total="0">test node 1</li>
                    <li data-total="2">test node 2</li>
                    <li data-total="7">test node 3</li>
                </ul>
            </li>
        </ul>
    </li>
    <li data-total="0">Node 4</li>
</ul>

134
задан Renat Zamaletdinov 28 March 2018 в 22:30
поделиться

3 ответа

Токенизатор повреждает поток текста в маркеры, обычно путем поиска пробела (вкладки, пробелы, новые строки).

Лексический анализатор является в основном токенизатором, но он обычно присоединяет дополнительный контекст к маркерам - этот маркер является числом, тот маркер является строковым литералом, этот другой маркер является оператором равенства.

Синтаксический анализатор берет поток маркеров из лексического анализатора и превращает его в абстрактное синтаксическое дерево, представляющее (обычно) программа, представленная оригинальным текстом.

В последний раз я проверил, лучшей книгой по предмету были "Компиляторы: Принципы, Методы и Инструменты", обычно просто известные как "Книга Дракона".

151
ответ дан 23 November 2019 в 23:57
поделиться

Пример:

int x = 1;

Лексический анализатор или токенизатор разделят это на маркеры 'интервал', 'x', '=', '1', ';'.

Синтаксический анализатор будет брать те маркеры и использовать их для понимания в некотором роде:

  • у нас есть оператор
  • это - определение целого числа
  • целое число называют 'x'
  • 'x' должен быть инициализирован со значением 1
14
ответ дан 23 November 2019 в 23:57
поделиться

Я сказал бы, что лексический анализатор и токенизатор являются в основном тем же самым, и что они разбивают текст в его составные части ('маркеры'). Синтаксический анализатор затем интерпретирует маркеры с помощью грамматики.

Я не стал бы слишком одержимым точным терминологическим использованием, хотя - люди часто используют 'парсинг' для описания любого действия интерпретации глыбы текста.

4
ответ дан 23 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

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