为不同语言本地化令牌
Localize token for different languages
使用 ANTLR 开发新语法。我的语法支持基本的数学和布尔表达式,例如 "4 等于(2 减 2)" 或 "true"、"false"。所有运算符均使用自然语言。我想在本质上支持其他语言。例如,"4 等于 4" 在德语中是 "4 ist 4"。
本地化令牌 and/or 表达式的最佳做法是什么?
在我们的项目中,我们遵循这种结构。有文件FooLexerBase.g
和FooLexerLang1.g
、FooLexerLang2.g
等。基本语法定义了公共标记规则。依赖语言的token在base中没有定义,但是可以引用。这些标记是在特定于语言的语法中定义的,它们都包含基数。
所以,基本上它看起来像这样:
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)。
使用 ANTLR 开发新语法。我的语法支持基本的数学和布尔表达式,例如 "4 等于(2 减 2)" 或 "true"、"false"。所有运算符均使用自然语言。我想在本质上支持其他语言。例如,"4 等于 4" 在德语中是 "4 ist 4"。
本地化令牌 and/or 表达式的最佳做法是什么?
在我们的项目中,我们遵循这种结构。有文件FooLexerBase.g
和FooLexerLang1.g
、FooLexerLang2.g
等。基本语法定义了公共标记规则。依赖语言的token在base中没有定义,但是可以引用。这些标记是在特定于语言的语法中定义的,它们都包含基数。
所以,基本上它看起来像这样:
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)。