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.jarhttps://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 方法。

似乎没有为 Swift 目标设置 python3 语法。

语义谓词和动作经常(几乎总是)引入目标语言的代码。使语法“与目标无关”需要大量的纪律,对于某些语言来说,这是不可能的(鉴于 Python 对缩进的依赖,可能无法创建与目标无关的版本语法)。 python3 语法似乎已经竭尽全力通过使用基 类 作为注入目标特定代码的钩子来促进多个目标,但是这些基 类 没有实现 Swift.

我看到 Python、C#、Java 和 JavaScript 的目标,但没有 Swift.

的目标