Как читать эту диаграмму javascript?
В настоящее время я читаю Javascript: The Good Parts, и мне трудно понять их грамматические диаграммы.
Первый - это пробел
![enter image description here]()
Я не совсем уверен, как это прочитать, возможно, какой-то код поможет мне понять?
Спасибо за помощь в продвинутых парнях.
Ответы
Ответ 1
Начните с самого левого ||
и продолжайте вправо. Первый балл вниз (сразу же рядом с вашей начальной точкой) не может быть соблюден, потому что кривая не начинается слева (направление, в котором вы путешествуете.) Если вы посмотрите, откуда оно взялось, то должно быть легко сказать, что это представляет собой Цикл while
:
while (!EOF) {} // While there still text to parse
Вторая строка может быть выполнена за счет того, что кривая берется из левой (после текущей директории). Эта строка представляет это выражение if-else:
if (char == '/') {} // Forward slash
else if (char == '\n') {} // Line end
else if (char == '\t') {} // Tab
else if (char == ' ') {} // Space
Пробел, табуляция и конечная линия обе завершают функцию и либо return
, либо continue
. Однако, если символом является "Слишком длинный", ему необходимо проверить, является ли он одной строкой (//
) или многострочной (/* */
):
*char++; // Move to next character
if (char == '*') {} // Multi line
else if (char == '/') {} // Single line
Если это одна строка, она читается до конца строки и продолжается. Если он многострочный, он читается аналогичным образом, пока не найдет "*", за которым следует "/", а затем продолжит.
Ответ 2
Левая боковая двойная полоса ( "||" ) может рассматриваться как "вход" функции, а правая двойная полоска - как "выход". Таким образом, в этом случае символом или строкой является ввод, а пути между двойными барами - это тесты. Если символ/строка считается "пробелом" любого из тестов, вывод функции будет "true", иначе он будет "false".
В частности, скажем, вы следуете четвертому пути. На этом пути вы сначала столкнетесь с символом "/", а затем следуете другому "/", за которым следует любой другой символ до символа EOL. В этом случае, если строка кода "//пример", то вывод будет правдой.
Ответ 3
Подумайте об этом, как если бы вы являлись парсером или языком, и вам нужен набор правил для понимания входного потока символов.
Подумав, как работает парсер, вы можете точно понять, что составляет токены языка JavaScript.
Ответ 4
Грамматическая схема, на которую вы ссылаетесь, широко использовалась для документирования синтаксиса Pascal. В основном это блок-схема того, как анализируется исходный код. Каждый "кусок" диаграммы, в вашем примере, "пробел", подобен вызову функции. Технически мы говорим о паркуре рекурсивного спуска.
Итак, мой образ мышления:
Парсер получает символ из входного потока. Таким образом, мы идем "попробуйте" функцию пробела, если этот символ - это пробел, табуляция, конец строки или символ "/" , мы переходим к следующему шагу, если не выходим с возвратным значением "не найдено".
Если это был "/" , мы получим следующий символ. Если это другое "/" , мы читаем символы, пока не получим конец строки, а затем выйдем с возвращаемым значением "found".
Если следующий символ - это '', тогда мы будем читать все, что не является '/' или ''. и т.д.
В основном поток идет слева направо, но когда линия возвращается назад, мы повторяем. Оптимальная вещь об этих диаграммах заключается в том, что, как только вы ее повесите, легко быстро написать синтаксически правильный код. И вы можете легко закодировать рекурсивный парсер спуска, следуя "блок-схеме".
Ответ 5
(см. этот ответ)
Чтобы узнать, как читать железнодорожную диаграмму, вам нужно понять разницу графика в этих трех ситуациях:
ноль или больше, ноль или один, один или несколько.
Чтобы понять их различия (как показано на следующем рисунке), точка: "Вы начинаете с левого края и следуете по дорожкам на правый край". Итак, представьте, что вы поезд, вы просто повернуть направо, не можете повернуть налево.
![введите описание изображения здесь]()
приведенное выше изображение, созданное http://bottlecaps.de/rr/
На вкладке "Редактировать грамматику" введите следующую грамматику:
zeroormore ::= element*
zeroorone ::= element?
oneormore ::= element+