Maven 为 python3 ANTLR 语法文件生成 python 代码

Maven generates python code for python3 ANTLR grammar file

我下载了 Python3 ANLTR4 https://github.com/antlr/grammars-v4/blob/master/python/python3-py/Python3.g4 的语法文件,当我 运行 在 eclipse 中使用 mvn generate-sources 时,Python3Lexer.java 生成的文件包含一些 Java 和一些 Python 代码,例如:

private void NEWLINE_action(RuleContext _localctx, int actionIndex) {
        switch (actionIndex) {
        case 0:

            tempt = Lexer.text.fget(self)
            newLine = re.sub("[^\r\n\f]+", "", tempt)
            spaces = re.sub("[\r\n\f]+", "", tempt)
            la_char = ""
            try:

pom 中的 antlr 依赖项:

dependency>
            <groupId>org.antlr</groupId>
            <artifactId>antlr4-runtime</artifactId>
            <version>4.7.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.abego.treelayout</groupId>
                    <artifactId>org.abego.treelayout.core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
plugin>
                <groupId>org.antlr</groupId>
                <artifactId>antlr4-maven-plugin</artifactId>
                <version>4.7.1</version>
                <executions>
                    <execution>
                        <id>antlr</id>
                        <goals>
                            <goal>antlr4</goal>
                        </goals>
                        <configuration>
                            <listener>false</listener>
                            <visitor>true</visitor>
                            <treatWarningsAsErrors>true</treatWarningsAsErrors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

有什么建议吗?

语法中有一些 predicates 包含目标特定代码(在您的情况下为 Python)。您选择了这个语法:

https://github.com/antlr/grammars-v4/blob/master/python/python3-py/Python3.g4
                                                        ^^^^^^^^^^

但应该采用这个 https://github.com/antlr/grammars-v4/blob/master/python/python3/Python3.g4,其中包含谓词中的 Java 代码。

为了清楚起见,如果您的语法如下所示:

grammar T;

parse
 : ANY* EOF
 ;

ANY
 : .
 ;

SPACE
 : [ \t\r\n] -> skip
 ;

ANTLR 将为您生成任何有效的词法分析器和解析器(Java。Python,C#,任何您想要的有效目标)。但是,如果您的语法包含谓词:

grammar T;

parse
 : ( {_input.LT(1).getText().matches("\d")}? ANY )* EOF
 ;

ANY
 : .
 ;

SPACE
 : [ \t\r\n] -> skip
 ;

然后 {}? 之间的部分将简单地插入到您正在生成的解析器中,而不管目标 (!)。

这就是为什么总是建议不要尽可能使用谓词。所以在我上面的例子中,你可以这样写语法而不是使用谓词:

grammar T;

parse
 : ANY* EOF
 ;

ANY
 : [0-9]
 ;

SPACE
 : [ \t\r\n] -> skip
 ;

(然后将ANY改为DIGIT...)