与编码相关的官方文档,我一直很难阅读。我通常不理解它,除非将其与示例配对使用。我正在寻求澄清在阅读文档(如果有)时采用哪种约定的方式。请从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 [`;´]}
类似地,他们在列出该代码之前是在谈论分号的位置,但是整个代码行也得到了新的解释和讨论。如果用括号括起来,我为什么要假定它没有括号呢?而且我看到他们再次使用{}和[],我也不知道他们在引用什么,因为它没有明确说明我们在谈论一个表...它只是使用代码本身来解释其是否在谈论是否使用{}创建一个表,但我们拥有使用{}并且不谈论表的第一组代码。
正在使用什么约定?他们在第一行代码中实际上使用{}和[]试图做什么/显示什么?
如上所述at the beginning of the Lua documentation和in the section on the Lua grammar,Lua以extended BNF格式表示其语法。
EBNF具有自己的标点符号,具有自己的含义,就像您发现的::=
。但是作为一种语法,需要在标点符号的EBNF含义和“这种标点出现在语法定义的语言中”之间进行区分。因此,始终假定前一个含义。后者的含义只能通过quoting标点符号来实现。
所以这个:
var ::= prefixexp `[´ exp `]´`
表示prefixexp
,后跟一个中括号,然后是exp
,后跟一个中括号。
相比之下,这:
funcname ::= Name {`.´ Name} [`:´ Name]
意味着Name
,然后是.
的零个或多个子序列,然后是Name
,然后是:
的可选子序列,然后是Name
。因为这些是{}
和[]
对EBNF的含义。