微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用上下文无关语法指定的编程语言如何能够表达图灵机?

如何解决使用上下文无关语法指定的编程语言如何能够表达图灵机?

我一直在研究自动机理论、编译器和 CS 的基础知识,但有些基础知识我不明白。

我见过语言的乔姆斯基层次结构,其中具有不同表达能力的不同类别的语言与同等强大的自动机“相关联”。

来自维基百科:

语法自动

  • Type-0 递归可枚举图灵
  • Type-1 上下文相关的线性有界非确定性图灵机-
  • 类型 2 上下文无关非确定性下推自动
  • Type-3 正则有限状态自动

我已经看到每种编程语言都是图灵完备的,并且编程语言的语法规范(在 BNF 等中形式化)可以表示为上下文无关语法。

上下文无关文法没有等效的“关联”图灵机。

在解释/编译期间,以编程语言(如 C、python 等)编写的程序的源代码字符串被解析/翻译成抽象语法树

(按照我的理解,这就像在将字符串与正则表达式匹配时从字符串中提取数组,只不过这里的模式不是正则表达式,它是上下文无关文法,功能更强大,因此提取的树结构包含比线性数组(来自正则表达式的捕获组)更多的信息。)

因此编写的可能实现图灵机的程序被转换为抽象语法树,并且原始程序中包含的所有信息现在都合并到树中。之后,在执行过程中,该程序将完成一些可能与图灵机一样复杂的计算。

我的问题是: 如何在上下文无关语法所规定的规则范围内表达字符串,实现图灵机,而等价语法/语言/自动机和乔姆斯基层次结构说上下文无关语法不够表达这样做?

我的假设之一是错误的吗? 或者是记忆在这方面起作用的事实,并且有一个定理是这样说的: 图灵机可以“使用”树+堆栈来实现?

这真的让我很烦。

任何可以启发我的东西真的很感激!

编辑:

这是我问题的重复

chomsky hierarchy and programming languages

为什么我错误地认为编程语言的语法规范定义了它的语义?

因为 YACC 的作用:(语法导向翻译)

https://en.wikipedia.org/wiki/Syntax-directed_translation

它将用于解析编程语言(用于制作抽象语法树)的上下文无关语法规则与动作相关联。 这就是我困惑的根源。

例如,这里是perl5 解释器源代码 摘录的复制粘贴。这是 perly.y 文件,yacc 使用它 进行第一遍编译。

   /* Binary operators between terms */
    termbinop:  term[lhs] ASSIGnop term[rhs]   /* $x = $y,$x += $y */
                { $$ = newASSIGnop(OPf_STACKED,$lhs,$ASSIGnop,$rhs); }

        |   term[lhs] POWOP term[rhs]           /* $x ** $y */
            { $$ = newBInop($POWOP,scalar($lhs),scalar($rhs)); }

        |   term[lhs] MULOP term[rhs]           /* $x * $y,$x x $y */
                {   if ($MULOP != OP_REPEAT)
                    scalar($lhs);
                    $$ = newBInop($MULOP,scalar($rhs));
                }

显示了派生规则与其相关操作(大括号内的内容)之间的一一对应关系。

解决方法

用于定义语言的语法“级别”决定了识别(解析)该语言所需的自动机,但这与该语言的“能力”无关。

例如,如果您使用类型 2 语法 (CFG) 来定义一种语言,乔姆斯基层次结构会告诉您您需要一个下推自动机来识别它,但该语言可能是一种图灵完备的编程语言,或者它可能是一种用于正则表达式的语言,也可能是一种完全没有计算“能力”的语言。

举一个更极端的例子,你可以想象使用类型 3 语法(正则表达式)来定义一种用于“编程”图灵机的语言。

一种语言的力量(特别是它是否是图灵完备的)取决于它的语义,而不是它的语法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。