Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 导入lexer语法(ANTLR 4)_Java_Maven_Antlr4 - Fatal编程技术网

Java 导入lexer语法(ANTLR 4)

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:

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
;