Python语法在内部如何使用?

Python语法在内部如何使用?,第1张

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

我们可以使用以下推导:

  1. 单输入
  2. compound_stmt newline
  3. if_stmt newline
  4. ‘if’test’:’套件newline
  5. ‘if’or_test’:’newline INDENT stmt stmt DEDENT newline
  6. ‘if’and_test’or’and_test’:’newline INDENT simple_stmt DEDENT newline
  7. ‘如果’not_test’或’not_test’:’newline INDENT small_stmt DEDENT newline
  8. ‘如果’比较’或’‘不是’not_test’:’newline INDENT flow_stmt DEDENT newline
  9. ‘if’expr comp_op expr’或’‘not’比较’:’‘newline INDENT raise_stmt DEDENT newline
  10. ‘if’arith_expr’<’arith_expr’或’‘not’arith_expr comp_op arith_expr’:’newline INDENT’raise’DEDENT newline
  11. ‘if’词’<’词’+’词’或’‘not’arith_expr == arith_expr’:’newline INDENT’raise’DEDENT newline
  12. ‘if’NUMBER’<’NUMBER’+’NUMBER’or’‘not’NUMBER == NUM​​BER’:’newline INDENT’raise’DEDENT newline

首先,在这里有两个注意事项,我们必须从列出为起始非终端的非终端之一开始。在该页面中,他们将它们列出为single_input,file_input或eval_input。其次,一旦所有符号都终止了,派生就完成了(因此得名)。第三,更常见的做法是每行进行一次替换,为简洁起见,我立即进行了所有可能的替换,并开始在结尾处跳过步骤。

给定语言字符串,我们如何找到它的派生?这是解析器的工作。解析器对生产序列进行逆向工程,以首先检查它是否确实是有效字符串,然后再检查如何从语法中得出该字符串。值得注意的是,许多语法可以描述一种语言。但是,对于给定的字符串,每个语法的推导当然会有所不同。因此,从技术上讲,我们为语法而不是语言编写解析器。一些语法更易于解析,一些语法更易于阅读/理解。这个属于前者。

同样,这并没有指定整个语言,而是它的外观。语法对语义一无所知。

如果您对解析和语法有更多的兴趣,我建议使用Grune,Jacobs-
解析技术
。它是免费的,适合自学。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5647421.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存