语法用于描述语言中所有可能的字符串。在指定解析器应如何解析语言时也很有用。
在此语法中,似乎他们使用的是自己的EBNF版本,其中非终止符是任何小写单词,而终止符则全部是大写字母或用引号引起来。例如,NEWLINE是终端,arith_expr是非终端,而’if’也是终端。任何非终结符都可以由其相应生产规则的冒号右侧的任何内容替换。例如,如果您查看第一个规则:
single_input:NEWLINE | simple_stmt | compound_stmt NEWLINE
我们可以用newLINE,simple_stmt或compound_stmt后跟NEWLINE之一替换single_input。假设我们将其替换为“ compound_stmt NEWLINE”,那么我们将寻找compound_stmt的生产规则:
compound_stmt:if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | 装饰的
并选择我们要使用的其中一个,然后将其替换为“ compound_stmt”(将NEWLINE保留在此处)
假设我们要生成有效的python程序:
if 5 < 2 + 3 or not 1 == 5:
raise
我们可以使用以下推导:
首先,在这里有两个注意事项,我们必须从列出为起始非终端的非终端之一开始。在该页面中,他们将它们列出为single_input,file_input或eval_input。其次,一旦所有符号都终止了,派生就完成了(因此得名)。第三,更常见的做法是每行进行一次替换,为简洁起见,我立即进行了所有可能的替换,并开始在结尾处跳过步骤。
给定语言字符串,我们如何找到它的派生?这是解析器的工作。解析器对生产序列进行逆向工程,以首先检查它是否确实是有效字符串,然后再检查如何从语法中得出该字符串。值得注意的是,许多语法可以描述一种语言。但是,对于给定的字符串,每个语法的推导当然会有所不同。因此,从技术上讲,我们为语法而不是语言编写解析器。一些语法更易于解析,一些语法更易于阅读/理解。这个属于前者。
同样,这并没有指定整个语言,而是它的外观。语法对语义一无所知。
如果您对解析和语法有更多的兴趣,我建议使用Grune,Jacobs- 解析技术。它是免费的,适合自学。