我正在为一种语言编写词法分析器/解析器,该语言允许其关键字使用缩写(和 glob)。而且,我正在尝试确定最好的方法。
我想到的一个想法是在词法分析器和解析器之间插入一个阶段,词法分析器在其中识别通用类,例如这是“命令名”还是“选项”,然后将这些通用标记传递给第二阶段进行进一步分析并识别它是哪个命令名称并将其作为令牌类型传递给解析器。
这将使解析器变得简单。我只需要处理格式正确的命令名称。每个令牌都将清楚其含义。
它将使词法分析器保持简单。它只需要将事物划分为类。这是一个简单的名字。这是一个球体。这是一个选项名称(以破折号开头)。
相是中间也会比较简单。简单的名称(和选项形式)只需要处理字符串。glob 表单可以使用标准 glob 技术将 glob 与合法候选者进行匹配,这些候选者位于简单名称和选项的表中。
问题是如何将该阶段插入 ANTLR,以便我调用词法分析器并创建标记,中间阶段对它们进行按摩,然后解析器获取中间阶段分类的标记。
对此有已知的解决方案吗?
就像是:
lexer grammar simple
letter: [A-Z][a-z];
digit: [0-9];
glob-char: [*?];
name: letter (letter | digit)*;
option: '-'name;
glob: (glob-char|letter)(glob-char|letter|digit)*;
glob-option: '-'glob;
filter grammar name;
end: 'e' | 'end';
generate: 'ge' | 'generate';
goto: 'go' | 'goto';
help: 'h' | 'help';
if: 'i' | 'if';
then: 't' | 'then';
parser grammar simple;
用户(编写我正在解析的语言的程序员)需要编写
g*te并拥有 if match generate。
当词法分析器和解析器看到一个 glob 时,它之间的阶段需要查看 glob(和关键字列表),看看它们中是否只有一个与 glob 匹配,如果是,则返回该关键字。我在“过滤器语法”中列出的东西是构建关键字 glob 可以匹配的列表的东西。我在网上找到了将 glob 与名称列表匹配的代码。那部分并不难。
而且,我已经在 ANTLR 文档中找到了如何在匹配令牌时运行任意代码以及如何更改生成的令牌类型。(见我的回答。)