Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';这是开始编写编程语言的一个很好的资源,即';这不是上下文无关的吗?_Python_Compiler Construction_Programming Languages_Interpreter - Fatal编程技术网

Python 什么';这是开始编写编程语言的一个很好的资源,即';这不是上下文无关的吗?

Python 什么';这是开始编写编程语言的一个很好的资源,即';这不是上下文无关的吗?,python,compiler-construction,programming-languages,interpreter,Python,Compiler Construction,Programming Languages,Interpreter,我想写一种编程语言是为了好玩,不过我看到的大部分资源都是为了写一种上下文无关的语言,不过我希望写一种像python一样使用缩进的语言,据我所知,缩进意味着它不能是上下文无关的。我不知道有任何教程/指南,但是您可以尝试查看源代码,因为它是类似python语言的一个非常小的实现。您可能想阅读这篇关于解析python的文章 虽然我还没有尝试使用类似于yacc的东西编写上下文无关的解析器,但我认为可以使用条件lexer返回url中描述的缩进更改标记 顺便说一句,这里是python.org的官方pytho

我想写一种编程语言是为了好玩,不过我看到的大部分资源都是为了写一种上下文无关的语言,不过我希望写一种像python一样使用缩进的语言,据我所知,缩进意味着它不能是上下文无关的。

我不知道有任何教程/指南,但是您可以尝试查看源代码,因为它是类似python语言的一个非常小的实现。

您可能想阅读这篇关于解析python的文章

虽然我还没有尝试使用类似于yacc的东西编写上下文无关的解析器,但我认为可以使用条件lexer返回url中描述的缩进更改标记


顺便说一句,这里是python.org的官方python语法:

在语言中使用缩进并不一定意味着语言的语法不能与上下文无关。也就是说,缩进将决定语句存在的范围。无论在哪个范围内定义语句,它仍然是一个语句(范围通常可以由编译器/解释器的不同部分处理,通常是在语义解析期间)


也就是说,一个好的资源是antlr工具()。该工具的作者还编写了一本关于使用antlr()为语言创建解析器的书。有相当好的文档和大量的示例语法。

仅仅因为一种语言使用了显著的缩进并不意味着它本质上是上下文敏感的。例如,Haskell使用了显著缩进,而且(据我所知)它的语法与上下文无关

需要上下文敏感语法的源代码示例可以是Ruby中的以下代码段:

my_essay = << END_STR
This is within the string
END_STR

<< self
  def other_method
    ...
  end
end

my_随笔=我建议您手工编写解析器,在这种情况下,有大量空白不应该出现任何实际问题

使用解析器生成器的主要问题是很难在解析器中获得良好的错误恢复。如果您计划为您的语言实现一个IDE,那么良好的错误恢复对于让Intellisence这样的东西正常工作是很重要的。Intellisence总是在不完整的语法结构上工作,解析器越能弄清楚用户试图键入的结构,您就能提供越好的Intellisence体验


如果您编写一个手工编写的自上而下的解析器,您几乎可以在任何地方实现您想要的任何规则。这使得提供错误恢复变得容易。它还将使您实现重要的空白变得微不足道。您可以简单地将当前缩进级别存储在解析器类内的变量中,并且当您在新行上遇到列位置小于当前缩进级别的标记时,可以停止解析块。此外,你很可能会在语法上遇到歧义。大多数广泛使用的“产品”语言都有语法歧义。C#中的泛型就是一个很好的例子(关于“你读过Aho、Sethi、Ullman的《编译器:原理、技术和工具》吗?”)这是一本经典语言参考书


/Allan

如果你以前从未编写过语法分析器,那么从简单的东西开始吧。语法分析器出人意料地微妙,如果你从未研究过编程语言的结构,你可能会在编写它们时遇到各种各样的麻烦


阅读Aho、Sethi和Ullman(它被称为“龙之书”)是一个很好的计划。与其他贡献者相反,我建议您应该首先使用更简单的解析器生成器,如Yacc和Bison,并且只有当您因为无法使用该工具而被烧坏时,才应该继续尝试使用LL(*)构建某些东西类似Antlr的解析器。

上下文敏感语言?这是一种非缩进语言:Protium()

我会先通过阅读一些关于这一主题的文献来熟悉这个问题。Aho等人的经典汇编书籍可能对数学和comp-sci很感兴趣,但更容易理解的文本是Jack Crenshaw的文章。这是Crenshaw先生在上世纪90年代写的一系列文章80年代,这是有史以来最不受欢迎的编译器文本。方法简单明了:克伦肖先生展示了“A"有效的方法。您可以在几个晚上轻松浏览内容,更好地理解编译器的功能。需要注意的是,本文中的示例是用Turbo Pascal编写的,编译器发出68K汇编代码。这些示例很容易移植到更新的编程语言nguage和我为此推荐Python。但如果您想按照示例进行介绍,您至少需要和。该文本今天仍然相关,使用这些旧技术非常有趣。我强烈建议将其作为任何人的第一篇编译器文本。好消息是,Python和Ruby等语言都是开源的你可以下载并研究C源代码,以便更好地理解它是如何完成的。

简单地说,上下文无关语法不需要符号表就可以正确解析代码。上下文敏感语法可以

< d >编程语言是上下文无关文法的一个例子。C++是上下文相关的。(例如,t*x声明x是指向t的指针,还是它是x乘以t?我们只能通过查找符号表中的T来判断它是一个类型还是一个变量。) 空白与此无关


D使用上下文无关语法来大大简化解析过程,这样简单的工具就可以解析它(比如语法突出显示编辑器)。

如果您真的要在语言设计和实现上下功夫,您可能需要添加以下内容
def doSomething() = {
  val xml = <code>def val <tag/> class</code>
  xml
}
int main()
{
    int i;
    i = 1;
    return 0;
}

int main()
{
    int i;
    i = "Hello, world";
    return 0;
}