antlr4 - 为不同语言本地化令牌
问题描述
使用ANTLR开发新语法。我的语法支持基本的数学和布尔表达式,如“4 等于(2 减 2)”或“真”、“假”。所有运算符都使用自然语言。我想支持其他语言的性质。例如,“4 等于 4 ”在德语中是“4 ist 4” 。
本地化标记和/或表达式的最佳做法是什么?
解决方案
在我们的项目中,我们遵循这种结构。有文件FooLexerBase.g
和FooLexerLang1.g
,FooLexerLang2.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)中看起来都差不多。
推荐阅读
- python - 限制函数仅使用来自特定实例的参数
- javascript - 当鼠标悬停在 iframe 上时,mousemove 事件会丢失轨道?
- python - Win32Api 导致 pyinstaller 出现问题
- node.js - 无法连接到数据库 Heroku nestjs mongoose
- c++ - 将数组从一个对象复制到另一个对象
- time-complexity - 快速选择最坏情况(Θ(n^2) 还是 O(n^2)?)
- vba - ContentControl.Range.Text 有时会返回双问号?
- julia - 在 Julia 中落后和领先
- c++ - 验证自行实现的伪组装的停止问题
- javascript - 在创建主窗口之前,如何在主进程中安全地预加载内容?