本地化不同语言的令牌



使用ANTLR开发新语法。我的语法支持基本的数学和布尔表达式,如"4等于(2减2(">或"true"、"false"。所有运算符都使用自然语言。我想支持其他语言的本质。例如,"4等于4">在德语中为"4 ist 4">

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

在我们的项目中,我们遵循这种结构。有FooLexerBase.gFooLexerLang1.gFooLexerLang2.g等文件。基本语法定义了通用的令牌规则。依赖于语言的令牌没有在基中定义,但可以被引用。这些令牌在特定于语言的语法中定义,所有语法都包括基。

所以,基本上它看起来像这样:

FooLexerBase.g:

lexer grammar FooLexerBase;
...
FLOATING_POINT
: DIGIT+                    EXPONENT
| DIGIT+ DECIMAL_SEP DIGIT* EXPONENT?
|        DECIMAL_SEP DIGIT+ EXPONENT?;
...

DIGITEXPONENT是在库中定义的,因为它们是通用的,而DECIMAL_SEP是特定于语言的。

例如,FooLexerGerman.g如下所示:

lexer grammar FooLexerGerman;
import base = FooBase;
...
fragment
DECIMAL_SEP:  ',';
...

最后,语法分析器在所有语言中都是通用的。它是这样定义的:

parser grammar FooParser;
options {
tokenVocab = FooLexerBase;
}
...

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

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

相关内容

  • 没有找到相关文章

最新更新