首页 > 解决方案 > 为不同语言本地化令牌

问题描述

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

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

标签: antlr4dsl

解决方案


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

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

FooLexerBase.g

lexer grammar FooLexerBase;

...
FLOATING_POINT
    : DIGIT+                    EXPONENT
    | DIGIT+ DECIMAL_SEP DIGIT* EXPONENT?
    |        DECIMAL_SEP DIGIT+ EXPONENT?;
...

DIGIT并且EXPONENT在基础中定义,因为它们是通用的,DECIMAL_SEP而是特定于语言的。

例如,FooLexerGerman.g看起来像这样:

lexer grammar FooLexerGerman;

import base = FooBase;

...
fragment
DECIMAL_SEP:  ',';
...

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

parser grammar FooParser;

options {
    tokenVocab = FooLexerBase;
}

...

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

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


推荐阅读