Java 导入lexer语法(ANTLR 4)
我有一个简单的测试语法,分为两部分。第一部分是lexer:Java 导入lexer语法(ANTLR 4),java,maven,antlr4,Java,Maven,Antlr4,我有一个简单的测试语法,分为两部分。第一部分是lexer: lexer grammar TestLexer; @lexer::header { package de.test; } BOOL : ([Tt][Rr][Uu][Ee] | [Ff][Aa][Ll][Ss][Ee]) ; AND : '&' ; OR : '|' ; IMPLIES : '=>' ; IFF : '<=>' ; NOT : '!' ; WS : [ \t\n\r]+ -> sk
lexer grammar TestLexer;
@lexer::header {
package de.test;
}
BOOL : ([Tt][Rr][Uu][Ee] | [Ff][Aa][Ll][Ss][Ee]) ;
AND : '&' ;
OR : '|' ;
IMPLIES : '=>' ;
IFF : '<=>' ;
NOT : '!' ;
WS : [ \t\n\r]+ -> skip ; // ignore whitespace
ANY : . ;
可以看出,语法包括使用tokenVocab选项的lexer。我在maven存储库中有以下POM(我可以使用的nexus中没有比ANTLR 4.7.1更高的版本。我认为我的问题与ANTLR 4的特定版本无关):
4.0.0
德斯特
抗扭试验
罐子
1.0-快照
抗扭试验
http://maven.apache.org
org.antlr
antlr4 maven插件
4.7.1
${basedir}/语法
${basedir}/src/main/java/de/test
真的
antlr4
org.antlr
antlr4运行时
4.7.1
1.8
${java.version}
${java.version}
当我现在编译语法(使用mvn clean install)时,将创建相应的lexer(TestGrammarLexer.java),而不包含相应的包信息。因此,它不能在我的项目中使用。手动更改包信息不是一个选项,因为我需要不时更新语法。这将强制重新生成已编译的类,因此包信息将被覆盖。我尝试使用ANTLR的import语句包含lexer。但是,这会导致其他问题,因为我有一个更复杂的语法,其中甚至不会生成相应的lexer类
当我将lexer与语法合并到一个g4文件中时,编译结果符合要求:
grammar TestGrammar2;
@lexer::header {
package de.test;
}
@parser::header {
package de.test;
}
BOOL : ([Tt][Rr][Uu][Ee] | [Ff][Aa][Ll][Ss][Ee]) ;
AND : '&' ;
OR : '|' ;
IMPLIES : '=>' ;
IFF : '<=>' ;
NOT : '!' ;
WS : [ \t\n\r]+ -> skip ; // ignore whitespace
ANY : . ;
formula :
BOOL
| NOT formula
| formula (AND | OR) formula
| formula IMPLIES formula
| formula IFF formula
;
语法测试语法2;
@lexer::header{
包装测试;
}
@解析器::头{
包装测试;
}
BOOL:([Tt][Rr][Uu][Ee][Ff][Aa][Ll][Ss][Ee]);
及:"及",;
或:“|”;
暗示:'=>';
IFF:“”;
不是:“!”;
WS:[\t\n\r]+->skip;//忽略空白
任何:;
公式:
布尔
|不是公式
|公式(和|或)公式
|公式意味着公式
|公式IFF公式
;
目前,我被迫将lexer与解析器合并到一个文件中。但是,我希望分离,因为我想在多个不同的语法中重用lexer语法。那么,我做错了什么?非常感谢您的帮助。Maven central提供了4.9.2版:但是,正如您所说,我认为这不是一个版本问题 我建议删除
@lexer::header
和@parser::header
定义,并将*.g4
文件放在/src/main/antlr4/de/test
中。生成的文件将获得包de.test
在我的POM文件中,我使用的ANTLR插件如下:
org.antlr
antlr4 maven插件
4.9.2
-访客
antlr4
我花了大量时间在Antlr语法中使用decl包。不要添加@header{package foobar;}
!Antlr工具具有-package
选项,专门用于以特定于目标的方式为语法生成名称空间/包声明。在pom.xml文件中,需要为该工具添加-package
参数。一个例子是。在grammars-v4中,我已经摆脱了所有这些,因为它在创建目标无关语法时会引起很多麻烦。谢谢@kaby76,我在POM中使用了-package
选项。这样我就不需要在src文件夹中集成语法(正如@bartkiers所建议的)。因此,我认为你的建议是解决我问题的最好办法。如果你想让我接受你的回答,你应该把你的评论作为回答(或者我有选择接受评论吗?);很高兴它起作用了。我只希望Antlr网站能更好地记录这一点。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.test</groupId>
<artifactId>antlrTest</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>antlrTest</name>
<url>http://maven.apache.org</url>
<build>
<plugins>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
<version>4.7.1</version>
<configuration>
<sourceDirectory>${basedir}/grammar</sourceDirectory>
<outputDirectory>${basedir}/src/main/java/de/test</outputDirectory>
<visitor>true</visitor>
</configuration>
<executions>
<execution>
<goals>
<goal>antlr4</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.7.1</version>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
</project>
grammar TestGrammar2;
@lexer::header {
package de.test;
}
@parser::header {
package de.test;
}
BOOL : ([Tt][Rr][Uu][Ee] | [Ff][Aa][Ll][Ss][Ee]) ;
AND : '&' ;
OR : '|' ;
IMPLIES : '=>' ;
IFF : '<=>' ;
NOT : '!' ;
WS : [ \t\n\r]+ -> skip ; // ignore whitespace
ANY : . ;
formula :
BOOL
| NOT formula
| formula (AND | OR) formula
| formula IMPLIES formula
| formula IFF formula
;