您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python语法在内部如何使用?

Python语法在内部如何使用?

语法用于描述语言中所有可能的字符串。在指定解析器应如何解析语言时也很有用。

在此语法中,似乎他们使用的是自己的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- 解析技术。它是免费的,适合自学。

python 2022/1/1 18:36:50 有225人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶