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
...)
我下载了 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
...)