Antlr4 本地化不同语言的标记

Antlr4 本地化不同语言的标记,antlr4,dsl,Antlr4,Dsl,使用ANTLR开发新语法。我的语法支持基本的数学和布尔表达式,如“4等于(2减2)”或“真”、“假”。所有运算符都使用自然语言。我想支持其他语言的性质。例如,“4等于4”在德语中是“4等于4” 本地化标记和/或表达式的最佳实践是什么?在我们的项目中,我们遵循这种结构。有文件doublexerbase.g和doublexerlang1.g,doublexerlang2.g等等。基本语法定义了常用的标记规则。依赖于语言的标记不在基中定义,但可以引用。这些标记在特定于语言的语法中定义,所有这些语法都包

使用ANTLR开发新语法。我的语法支持基本的数学和布尔表达式,如“4等于(2减2)”或“真”、“假”。所有运算符都使用自然语言。我想支持其他语言的性质。例如,“4等于4”在德语中是“4等于4”


本地化标记和/或表达式的最佳实践是什么?

在我们的项目中,我们遵循这种结构。有文件
doublexerbase.g
doublexerlang1.g
doublexerlang2.g
等等。基本语法定义了常用的标记规则。依赖于语言的标记不在基中定义,但可以引用。这些标记在特定于语言的语法中定义,所有这些语法都包括基

所以,基本上看起来是这样的:

lexer grammar FooLexerGerman;

import base = FooBase;

...
fragment
DECIMAL_SEP:  ',';
...
base.g

lexer grammar FooLexerBase;

...
FLOATING_POINT
    : DIGIT+                    EXPONENT
    | DIGIT+ DECIMAL_SEP DIGIT* EXPONENT?
    |        DECIMAL_SEP DIGIT+ EXPONENT?;
...
数字
指数
是在基数中定义的,因为它们是常见的,而
十进制SEP
是特定于语言的

例如,
g.g
如下所示:

lexer grammar FooLexerGerman;

import base = FooBase;

...
fragment
DECIMAL_SEP:  ',';
...
最后,解析器语法对于所有语言都是通用的。其定义如下:

parser grammar FooParser;

options {
    tokenVocab = FooLexerBase;
}

...
重要的是不要使用ANTLR处理
base
,而是通过它传递所有其他语法

在运行时,您构建一个解析器,并将适当的lexer作为参数传递给构造函数。我猜它在任何编程语言(我们使用Java)中看起来都差不多