Antlr4 中的显式数据类型

问题描述

我是 Antlr 的新手并用 Java 编写,我目前正试图弄清楚如何让解析器将标记“var”识别为 int、string 等。就像在 javascript 中使用 var 一样或让。我正在尝试编写自己的具有显式数据类型的编程语言,以便初学者可以更轻松地开始编码,而不必担心他/她是否使用 int/string/char 等。

我似乎没有在网上找到任何相关文档,所以我希望这里有人可以教我如何实现这一点

解决方法

这不是您可以直接使用 ANTLR 完成的任务。

ANTLR 生成代码来为您生成解析器。这意味着它将处理您的输入并生成一个数据结构(在 ANTLRs 情况下为 ParseTree),该结构正确地对您的所有输入进行分类(假设它在语法上是正确的;否则会出现错误消息)。

在您的情况下,您有一个 ParseTree 可以正确识别您有一个 var 关键字、一个标识符(您的变量名称)、一个 = 和一个值。这可能是匹配匹配解析规则的结果,例如 assignmentStmt

使用内存中的 ParseTree,您将拥有 ANTLR 生成的侦听器和/或访问者类,以便轻松导航该 ParseTree。

为您解析出所有内容(由 ANTLR),您可以在自己的代码中进行类型推断(您所描述的是类型推断而不是“显式类型”)。或者,如果您想允许将任何类型分配给您的变量,您实际上没有任何需要做的事情(您拥有一种无类型语言,无需验证类型。您的 runtime 当然,想要跟踪当前分配的值的类型是什么,但允许分配任何类型的新值。)

Antlr 的工作是根据您的语法正确识别所有部分(类型检查是一个语义问题,而不是解析器自己关心的问题)。它不会为您创建符号表,也不会尝试进行类型推断。一旦输入被解析,这些任务就由您决定了。

旁注,JavaScript 是无类型的,所以你只有一个变量或常量,可以容纳任何东西,没有类型(推断的或显式的)。

显式输入类似于:

var myString : String;

隐式输入类似于:

var myVar = "String"

并且您的代码基本上会说“他们已将一个字符串分配给 myVar,因此,此后,myVar 是一个字符串类型,并且不会接受除字符串以外的任何值。

在 JavaScript 中,你只是得到一个变量,你可以直接给它赋值,一个对象,或者任何你喜欢的东西(它是无类型的)。​​

,

解析器是一种工具,用于确定某些输入在语法上是否正确,并且可以将输入转换为特定的数据结构(如果是这种情况)(如 Mike Cargal 所解释的那样)。这意味着解析器是处理输入语法的工具。

指定输入的类型和其他元信息就是对某些字符串赋予意义,这通常称为语义处理。

知道解析器是一种语法工具,应该清楚解析器不能用于应用语义。区分语法和语义,了解哪个工具可以做什么很重要。

如何以您想要的方式应用语义是一个完整的主题,而且范围太广,无法在一个问题中处理。