Есть ли руководство/соглашение по разметке, используемой в официальной документации lua?

Мне постоянно очень трудно читать официальную документацию, когда она связана с кодированием. Обычно я не понимаю этого, если это не связано с примером. Я ищу разъяснений о том, какие соглашения действуют при чтении документов, если таковые имеются. Возьмите приведенный ниже пример из руководства по lua (https://www.lua.org/manual/5.1/manual.html#2.1):

stat ::= if exp then block {elseif exp then block} [else block] end

Первое слово, Stat, определяется как оператор, и «этот набор включает присваивания, управляющие структуры, вызовы функций и объявления переменных».

::= Не определено в документах, к счастью, его можно найти в Google.

Exp связан и объяснен.

Блок также имеет раздел.

Но тогда они делают {} и []. Они буквально заявили: «Квадратные скобки используются для индексации таблицы» всего несколькими строками выше. И эти волнистые скобки для написания таблицы. Итак, что я должен сделать из этого? Что {} и [] используются для обозначения отдельных разделов в качестве разметки, чтобы облегчить просмотр определенных компонентов? Или что {elseif exp then block} — это таблица с этими значениями внутри себя, а [else block] — это ключ-значение, индексирующее таблицу? Если бы я писал документ, в котором это действительно так, разве я не написал бы его таким образом?

Тогда я вижу

var ::= prefixexp `[´ exp `]´`

' ' определяет строку, но я должен сделать предположение, что '[' ']' используется как способ подчеркнуть тот факт, что, поскольку они говорили о том, что делают квадратные скобки в предыдущем разделе, они просто выделяют свою позицию и это не должно быть включено в код. Я только знаю, как сделать это предположение, потому что я знаю, что это не сработает, когда вы поместите их туда.

Но потом я вижу это:

chunk ::= {stat [`;´]}

Точно так же они говорят о размещении точки с запятой перед перечислением этого кода, но вся строка кода также была недавно объяснена и обсуждалась. Почему я должен предположить, что это написано без скобок, если оно написано со скобками? И я вижу, что они снова используют {} и [] , и я понятия не имею, на что они ссылаются, потому что явно не указано, что мы говорим о таблице... это просто использование самого кода, чтобы объяснить, идет ли речь о таблица или нет с {}, но у нас есть тот первый набор кода, где {} используется, и это не говорит о таблице.

Какое соглашение используется? Что они на самом деле пытаются сделать/показать, используя {} и [] в первой строке кода?


person kite    schedule 01.11.2019    source источник


Ответы (1)


Как указано как в начале документации по Lua, так и в разделе, посвященном грамматике Lua, Lua представляет свою грамматику в расширенный формат BNF.

EBNF имеет свою собственную пунктуацию со своим собственным значением, например ::=, как вы обнаружили. Но как грамматика, должно быть различие между значением EBNF части пунктуации и «эта пунктуация появляется в языке, определенном грамматикой». Поэтому всегда предполагается первое значение; последнее значение может быть достигнуто только путем цитирования пунктуации.

Итак, это:

var ::= prefixexp `[´ exp `]´`

Означает prefixexp, за которым следует открытая скобка, за которой следует exp, за которым следует закрывающая скобка.

Напротив, это:

funcname ::= Name {`.´ Name} [`:´ Name]

Означает Name, за которым следует ноль или более подпоследовательностей ., за которыми следует Name, за которыми следует необязательная подпоследовательность :, за которой следует Name. Потому что это то, что {} и [] означают для EBNF.

person Nicol Bolas    schedule 01.11.2019