我正在使用antlr4来创建解释器lexer和parser。它将在包含QSCINTILLA2中使用的GUI。
由于QSCINTILLA不需要解析器,并且有一个自定义模块(Antlr4构建的Python3 Target)解释器是否足够?
我不是在要求意见,而是事实指导。谢谢。
解释器包含什么
解释器必须有某种方法来解析代码,然后将其运行。通常,"解析代码的方式"将由Lexer 解析器处理,但也可以进行无链解析。无论哪种方式,解析器都会创建一些代码的中间表示形式,例如树或字节码。然后,"运行它的方式"将是在生成的树或字节码上迭代并执行它的阶段。JIT计算(即,从树或字节码中生成机器代码,然后执行)也是可能的,但更高级。您还可以在解析和执行之间进行各种分析(例如,您可以检查是否有任何未定义的变量或在任何地方使用,也可以进行静态类型检查 - 尽管后者在解释的语言中并不常见)。
。使用ANTLR时,ANTLR将为您生成一个lexer和解析器,后者将产生解析树,您可以使用生成的侦听器或访客来迭代。那时,您可以看到与自己的代码合适的过程。例如,您可以从解析树生成字节码并执行该字节,将解析树转换为简化的树,并执行该树,或直接在访问者中执行解析树。
QSCINTILLA是关于显示语言的,而不是链接到解释器。在IDE中,控制台是解释器与运行脚本一起发挥作用的位置(例如,从"运行"按钮中)。Qscintilla和解释器唯一常见的是脚本文件 - 解释器未连接或链接到QSCINTILLA。这是基本意义的吗?
是的,这是有道理的,但这并不一定是完全这样的。也就是说,重复使用解释器的某些部分以在编辑器/IDE中实现某些功能是有意义的。
您已经特别提到了"运行"按钮,就此而言,解释器的实现(以及它是否使用antlr)绝对不关心。实际上,该解释器被写入哪种语言甚至无关紧要。如果您的解释器命名为mylangi
,并且您当前正在编辑一个名为foo.mylang
的文件,则击中"运行"按钮应简单地执行subprocess.run(["mylangi", "foo.mylang"])
并在某些中显示结果类型的标签或窗口。
相同,如果您想拥有一个可以与解释器进行交互的"控制台"或" repl"窗口:您只需将解释器作为子过程调用,然后将其连接到显示控制台的标签或子窗口。同样,解释器的实现是无关紧要的 - 您将其像其他任何命令行应用程序一样对待。
现在,IDE和代码编辑器具有的其他功能是语法突出显示,自动完成和错误突出显示。
对于语法突出显示,您需要一些通过源的代码,并告诉编辑器该代码的哪些部分应具有哪种颜色(或粗体等)。使用QSCINTILLA,您可以通过提供执行此操作的Lexer类来实现这一目标。您可以通过简单地编写必要的代码来手动检测令牌的类型来定义这样的类,但是您也可以重新使用Antlr生成的Lexer。因此,这是可以在编辑/IDE中重复使用解释器的一种方式。但是,由于语法荧光笔通常相当简单地手工写作,因此您不必这样做。
对于代码完成,您需要了解文件中定义了哪些变量和函数,其范围是什么以及当前文件中包含哪些其他文件。如今,在所谓的语言服务器中实现此逻辑是普遍的,该工具可以与不同的编辑器和IDE重复使用。无论您是在此类语言服务器中还是直接在编辑器中实现此逻辑,都需要解析器(如果适用,则需要一种类型的检查器)才能回答这些类型的问题。同样,这是您可以从解释器中重新利用的东西,这一次绝对是一个好主意,因为编写第二个解析器将是重要的额外工作(并且很容易与口译员的解析器同步)。
对于错误突出显示您可以简单地以"仅验证"模式调用解释器(即仅打印出可以静态检测但实际运行文件的语法错误和其他错误 - 许多解释者都有这样的选项),然后解析输出以找出在哪里绘制弯曲线的位置。但是,您还可以重新使用解析器(如果有的话,则可以分析)。如果您使用语言服务器的路线,则语言服务器也将处理错误和警告。