Как читать эту диаграмму 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+