口译员包含什么?

时间:2019-02-20 11:17:02

标签: python-3.x antlr4 qscintilla

我正在使用Antlr4创建解释器,词法分析器和解析器。将在其中使用的GUI包含QScintilla2。

由于QScintilla不需要解析器并且具有CustomLexer模块,(内置Antlr4,Python3目标)解释器就足够了吗?

我不是要征求意见,而是提供事实指导。谢谢。

1 个答案:

答案 0 :(得分:2)

  

解释器包含什么内容

解释器必须具有某种方式来解析代码,然后具有某种方式来运行它。通常,“解析代码的方式”将由词法分析器+解析器处理,但是无词法分析也是可能的。无论哪种方式,解析器都会创建代码的某些中间表示形式,例如树或字节码。然后,“运行它的方式”将是一个阶段,迭代生成的树或字节码并执行它。 JIT编译(即从树或字节码生成机器代码,然后执行该代码)也是可行的,但更为高级。您还可以在解析和执行之间运行各种分析(例如,您可以检查是否有任何未定义的变量或在任何地方使用它,或者可以进行静态类型检查-尽管后者在解释语言中并不常见)。

使用ANTLR时,ANTLR将为您生成一个词法分析器和解析器,后者将生成一个解析树,结果您可以使用生成的侦听器或访问器进行迭代。此时,您将按照自己的代码进行操作。例如,您可以从解析树生成字节码并执行,然后将解析树转换为简化树并执行,或者直接在访问者中执行解析树。

  

QScintilla与显示语言有关,并且未链接到解释器。在IDE中,控制台是解释器与运行脚本一起运行的地方(例如,通过“运行”按钮)。 QScintilla和解释器唯一的共同之处是脚本文件-解释器未连接或链接到QScintilla。这基本有道理吗?

是的,这是有道理的,但不必完全是那样。也就是说,重用解释器的某些部分以在编辑器/ IDE中实现某些功能是很有意义的,但是您不必这样做。

您已经特别提到了“运行”按钮,就此而言,解释器的实现(以及它是否使用ANTLR)绝对无关紧要。实际上,解释器使用哪种语言甚至都没有关系。如果您的解释器名为mylangi,而您当前正在编辑名为foo.mylang的文件,则只需单击“运行”按钮即可执行subprocess.run(["mylangi", "foo.mylang"])并在某种选项卡或窗口中显示结果。

与要具有可与解释器进行交互的“控制台”或“ REPL”窗口相同:您只需将解释器作为子进程调用,并将其连接到显示控制台的选项卡或子窗口即可。同样,解释器的实现与此无关,您可以像对待其他命令行应用程序一样对待它。

IDE和代码编辑器现在具有的其他功能是语法突出显示,自动完成和错误突出显示。

要突出显示语法,您需要通过源代码的一些代码,并告诉编辑器代码的哪些部分应具有哪种颜色(或粗体等)。使用QScintilla,您可以通过提供一个lexer类来完成此任务。您可以通过简单地编写必要的代码来手工检测令牌的类型来定义此类,但是您也可以重新使用ANTLR生成的词法分析器。因此,这是可以在编辑器/ IDE中重新使用解释器的实现的一种方式。但是,由于语法荧光笔通常很容易直接编写,因此您不必这样做。

要完成代码,您需要了解文件中定义了哪些变量和函数,它们的作用域以及当前文件中包括的其他文件。如今,在所谓的语言服务器中实现这种逻辑已变得很普遍,该服务器是可以从不同的编辑器和IDE中重复使用的独立工具。无论您是在这样的语言服务器中还是直接在编辑器中实现此逻辑,都将需要解析器(如果适用,还需要类型检查器)才能回答这些类型的问题。同样,您可以在解释器中重新使用它,这一次绝对是个好主意,因为编写第二个解析器将是大量的额外工作(并且很容易与解释器的解析器不同步)。

对于突出显示错误,您可以仅在“仅验证”模式下调用解释器(即,仅打印语法错误和其他可以静态检测到的错误,但实际上不运行文件-许多解释器都具有这种选项),然后解析输出以找出在哪里绘制波浪线。但是,您也可以改为使用解释器中的解析器(并分析是否有解析器)。如果您选择拥有语言服务器,那么语言服务器也会处理错误和警告。