Syntax 什么是常规语言?

Syntax 什么是常规语言?,syntax,programming-languages,bnf,regular-language,formal-languages,Syntax,Programming Languages,Bnf,Regular Language,Formal Languages,我试图理解语言级别(常规、上下文无关、上下文敏感等)的概念 我可以很容易地找到这个,但我找到的所有解释都是一堆符号和集合。我有两个问题: 你能用语言描述什么是常规语言,以及语言之间的区别吗 人们从哪里学会理解这些东西?据我所知,这是形式数学吗?我在大学上过几门课,都用过它,几乎没有人理解它,因为老师们以为我们知道它。我在哪里可以学到它,为什么人们“期望”在这么多的来源中知道它?这就像是教育上的差距 这是一个: 属于此集合的任何语言都是字母表上的常规语言 一门语言怎么能“超越”任何事物呢?以下是一

我试图理解语言级别(常规、上下文无关、上下文敏感等)的概念

我可以很容易地找到这个,但我找到的所有解释都是一堆符号和集合。我有两个问题:

  • 你能用语言描述什么是常规语言,以及语言之间的区别吗

  • 人们从哪里学会理解这些东西?据我所知,这是形式数学吗?我在大学上过几门课,都用过它,几乎没有人理解它,因为老师们以为我们知道它。我在哪里可以学到它,为什么人们“期望”在这么多的来源中知道它?这就像是教育上的差距

  • 这是一个:

    属于此集合的任何语言都是字母表上的常规语言


    一门语言怎么能“超越”任何事物呢?

    以下是一些与之相当的定义:

    […]正规语言是一种形式语言(即,一种可能的语言) 有限字母表中有限符号序列的无限集合) 满足以下等效特性的:

    • 它可以被确定性有限状态机接受

    • 它可以被非确定性有限状态机接受

    • 它可以用形式正则表达式来描述

      请注意,许多编程语言都提供了“正则表达式”功能 增加了使其能够识别的功能 不规则的语言,因此不严格 等价于形式正则表达式

    首先要注意的是,正则语言是有一些限制的。形式语言本质上是字符串的集合(可能是无限的)。例如,形式语言Java是所有可能的Java文件的集合,它是所有可能的文本文件集合的子集

    最重要的特征之一是,与不同的是,常规语言不支持任意嵌套/递归,但可以任意重复

    一种语言总是有一个基本的字母表,它是一组允许的符号。例如,一种编程语言的字母表通常是ASCII或Unicode,但在形式语言理论中,谈论语言而不是其他字母表也很好,例如二进制字母表,其中唯一允许的字符是
    0
    1


    在我的大学里,我们在编译器课上学到了一些正式的语言理论,但这在不同的学校可能是不同的。

    在计算机科学的背景下,一个词是符号的串联。使用的符号称为字母表。例如,由字母表
    {0,1,2,3,4,5,6,7,8,9}
    组成的一些单词将是
    1
    2
    12
    543
    1000
    002

    一种语言就是所有可能的单词的子集。例如,我们可能想定义一种语言来捕获所有精英MI6代理。这些都以双0开头,因此该语言中的单词将是
    007
    001
    005
    ,和
    0012
    ,但不是
    07
    15
    。为了简单起见,我们说语言是“在字母表上”,而不是“由字母表中的符号串联而成的单词子集”

    在计算机科学中,我们现在想对语言进行分类。如果通过一个接一个地检查单词中的所有符号,可以确定单词是否在使用算法/具有恒定(有限)内存的机器的语言中,我们称之为正则语言。仅由单词
    42
    组成的语言是规则的,因为您可以在不需要任意内存量的情况下确定单词是否在其中;您只需检查第一个符号是否为4,第二个符号是否为2,以及后面是否还有其他数字

    所有单词数量有限的语言都是规则的,因为我们(理论上)可以只构建一个大小不变的控制流树(您可以将其可视化为一组嵌套的
    if
    -语句,它们逐个检查一个数字)。例如,我们可以使用以下构造测试一个单词是否在“10到99之间的素数”语言中,除了在当前代码行编码的单词外,不需要内存:

    if word[0] == 1:
      if word[1] == 1: # 11
          return true # "accept" word, i.e. it's in the language
      if word[1] == 3: # 13
          return true
    ...
    return false
    
    请注意,所有有限语言都是正则的,但并非所有正则语言都是有限的;我们的double-0语言包含无限多的单词(
    007
    008
    ,但也包含
    004242
    0012345
    ),但可以使用恒定内存进行测试:要测试单词是否属于它,请检查第一个符号是否为
    0
    ,第二个符号是否为
    0
    。如果是这样,接受它。如果单词短于三个或不以
    00
    开头,则它不是MI6代码名

    形式上,a或a的构造用于证明语言是正则的。这些语句类似于上面的
    if
    -语句,但允许任意长的单词。如果有一个有限状态机,那么也有一个正则语法,反之亦然,所以只要显示其中一个就足够了。例如,我们双0语言的有限状态机是:

    start state:  if input = 0 then goto state 2
    start state:  if input = 1 then fail
    start state:  if input = 2 then fail
    ...
    state 2: if input = 0 then accept
    state 2: if input != 0 then fail
    accept: for any input, accept
    
    等价的规则语法是:

    start → 0 B
    B → 0 accept
    accept → 0 accept
    accept → 1 accept
    ...
    
    等价物为:

    有些语言是不规则的。例如,任意数量的
    1
    ,后跟相同数量的
    2
    (通常写为1n2n,表示任意n)的语言是不规则的-您需要更多的内存(=恒定数量的状态)来存储
    1
    的数量,以确定一个单词是否在该语言中


    这通常应该在理论计算机科学课程中解释。幸运的是,维基百科很好地解释了这两个方面。

    事实上,维基百科在解释这一切方面做得并不差。你可能想从一开始
    00[0-9]*