Antlr 4 生成 Swift 与 Python 混合
Antlr 4 generates Swift mixed with Python
我正在尝试使用 Antlr 4 生成可以解析 Python 3 代码的 Swift 代码。 Antlr 4 在生成的 Swift 文件中生成 Python 和 Swift 的混合。这个问题通过在最新的 MacOS.
上非常简单地安装最新的 Antlr4 jar 和最新的 Python3 语法来重现。
我在几乎全新安装的 Mac OS Monterey 12.4 上使用最新的 Antlr 4。具体来说,我正在使用 antlr-4.10.1-complete.jar
和 https://github.com/antlr/grammars-v4
的 master (2228b048
) 的 HEAD 中的 Python3.g4
文件
我正在按照这些说明操作:
https://github.com/antlr/antlr4/blob/master/doc/swift-target.md
我正在生成 Swift 使用:
# grammars-v4 is a clean copy of https://github.com/antlr/grammars-v4 at HEAD of master (`2228b048`)
cd grammars-v4
antlr4 -Dlanguage=Swift ./python/python3-py/Python3.g4 -o ../antlr-swift-python/
这会生成 4 个 Swift 文件。生成的 Python3Lexer.swift
文件包含 Swift(解析语言)和 Python(解析语言)的混合。
文件以 Python 开始,然后切换到 Swift。
// Generated from Python3.g4 by ANTLR 4.10.1
from antlr4.Token import CommonToken
import re
import importlib
# Allow languages to extend the lexer and parser, by loading the parser dynamically
module_path = __name__[:-5]
language_name = __name__.split('.')[-1]
language_name = language_name[:-5] # Remove Lexer from name
LanguageParser = getattr(importlib.import_module('{}Parser'.format(module_path)), '{}Parser'.format(language_name))
import Antlr4
open class Python3Lexer: Lexer {
internal static var _decisionToDFA: [DFA] = {
请注意 Python 样式的导入、注释和代码,然后是 Swift 导入和 Swift class 定义。
这贯穿整个文件。这是演示该问题的另一个片段:
public
static let VOCABULARY = Vocabulary(_LITERAL_NAMES, _SYMBOLIC_NAMES)
@property
def tokens(self):
try:
return self._tokens
except AttributeError:
self._tokens = []
return self._tokens
这里我们看到 Swift 属性 后跟 Python 方法。
- 我刚刚安装了 Antlr 4 和 grammars-v4;我没有编辑它的任何文件。
- 我能够成功生成 Swift 运行时并构建该框架。
似乎没有为 Swift 目标设置 python3 语法。
语义谓词和动作经常(几乎总是)引入目标语言的代码。使语法“与目标无关”需要大量的纪律,对于某些语言来说,这是不可能的(鉴于 Python 对缩进的依赖,可能无法创建与目标无关的版本语法)。 python3 语法似乎已经竭尽全力通过使用基 类 作为注入目标特定代码的钩子来促进多个目标,但是这些基 类 没有实现 Swift.
我看到 Python、C#、Java 和 JavaScript 的目标,但没有 Swift.
的目标
我正在尝试使用 Antlr 4 生成可以解析 Python 3 代码的 Swift 代码。 Antlr 4 在生成的 Swift 文件中生成 Python 和 Swift 的混合。这个问题通过在最新的 MacOS.
上非常简单地安装最新的 Antlr4 jar 和最新的 Python3 语法来重现。我在几乎全新安装的 Mac OS Monterey 12.4 上使用最新的 Antlr 4。具体来说,我正在使用 antlr-4.10.1-complete.jar
和 https://github.com/antlr/grammars-v4
2228b048
) 的 HEAD 中的 Python3.g4
文件
我正在按照这些说明操作:
https://github.com/antlr/antlr4/blob/master/doc/swift-target.md
我正在生成 Swift 使用:
# grammars-v4 is a clean copy of https://github.com/antlr/grammars-v4 at HEAD of master (`2228b048`)
cd grammars-v4
antlr4 -Dlanguage=Swift ./python/python3-py/Python3.g4 -o ../antlr-swift-python/
这会生成 4 个 Swift 文件。生成的 Python3Lexer.swift
文件包含 Swift(解析语言)和 Python(解析语言)的混合。
文件以 Python 开始,然后切换到 Swift。
// Generated from Python3.g4 by ANTLR 4.10.1
from antlr4.Token import CommonToken
import re
import importlib
# Allow languages to extend the lexer and parser, by loading the parser dynamically
module_path = __name__[:-5]
language_name = __name__.split('.')[-1]
language_name = language_name[:-5] # Remove Lexer from name
LanguageParser = getattr(importlib.import_module('{}Parser'.format(module_path)), '{}Parser'.format(language_name))
import Antlr4
open class Python3Lexer: Lexer {
internal static var _decisionToDFA: [DFA] = {
请注意 Python 样式的导入、注释和代码,然后是 Swift 导入和 Swift class 定义。
这贯穿整个文件。这是演示该问题的另一个片段:
public
static let VOCABULARY = Vocabulary(_LITERAL_NAMES, _SYMBOLIC_NAMES)
@property
def tokens(self):
try:
return self._tokens
except AttributeError:
self._tokens = []
return self._tokens
这里我们看到 Swift 属性 后跟 Python 方法。
- 我刚刚安装了 Antlr 4 和 grammars-v4;我没有编辑它的任何文件。
- 我能够成功生成 Swift 运行时并构建该框架。
似乎没有为 Swift 目标设置 python3 语法。
语义谓词和动作经常(几乎总是)引入目标语言的代码。使语法“与目标无关”需要大量的纪律,对于某些语言来说,这是不可能的(鉴于 Python 对缩进的依赖,可能无法创建与目标无关的版本语法)。 python3 语法似乎已经竭尽全力通过使用基 类 作为注入目标特定代码的钩子来促进多个目标,但是这些基 类 没有实现 Swift.
我看到 Python、C#、Java 和 JavaScript 的目标,但没有 Swift.
的目标