小编dod*_*air的帖子

使用Maven Antlr4插件从其他工件生成语法

我想使用antlr4为语法生成Java解析器api。我意识到其他人可能对语法部分感兴趣,因此我想将Maven中的解析器工件与语法工件分开。

我几乎可以使所有工作正常,问题似乎是它使用正确的包生成了* .java文件,但是将它们放在代表不同包的目录中。

我有一个多模块Maven项目,其中有一个父级和两个模块。语法和解析器。语法使用以下内容生成一个简单的jar:

META-INF/
META-INF/MANIFEST.MF
org/
org/boazglean/
org/boazglean/dabar/
org/boazglean/dabar/grammer/
org/boazglean/dabar/grammer/DabarLexer.g4
org/boazglean/dabar/grammer/DabarParser.g4
META-INF/maven/
META-INF/maven/org.boazglean.dabar/
META-INF/maven/org.boazglean.dabar/grammer/
META-INF/maven/org.boazglean.dabar/grammer/pom.xml
META-INF/maven/org.boazglean.dabar/grammer/pom.properties
Run Code Online (Sandbox Code Playgroud)

现在,我想生成一个解析器jar,在包中包含一堆解析器类org.boazglean.dabar.parser。这是我使用的pom配置:

<plugin>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-maven-plugin</artifactId>
    <version>4.0</version>
    <executions>
        <execution>
            <goals>
                <goal>antlr4</goal>
            </goals>
            <configuration>
                <sourceDirectory>${antlr.dir}</sourceDirectory>
                <listener>true</listener>
                <visitor>true</visitor>
                <arguments>
                    <argument>-package</argument>
                    <argument>org.boazglean.dabar.parser</argument>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>extract-grammer</id>
            <phase>initialize</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <includeArtifactIds>grammer</includeArtifactIds>
                <outputDirectory>${antlr.dir}</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

现在的问题是,生成的源位于错误的目录中(但是它们确实具有正确的包)。

head -n 2 parser/target/generated-sources/antlr4/org/boazglean/dabar/grammer/DabarLexer.java 

// Generated from org/boazglean/dabar/grammer/DabarLexer.g4 by ANTLR 4.0
package org.boazglean.dabar.parser;
Run Code Online (Sandbox Code Playgroud)

我是否缺少一些应该使用antlr4配置的命令?

maven antlr4

4
推荐指数
1
解决办法
4125
查看次数

antlr4 跨模式共享规则

我想编写一个具有多种模式的词法分析器。但模式大多相似。唯一的区别是我用不同的名字引用了同一个字符。我让它工作了,问题是我必须复制整个词法分析器,更改所有名称,添加类型,并为每种模式添加一行。

这是我要解决的一般问题。我希望逗号在 '[' ']' 之外具有高优先级。我希望它有内部的优先级很低'['']'。要做到这一点我推和弹出与模式'['']'。但是因为我唯一改变的是优先级,所以我必须将所有规则复制到每个模式中并给它们不同的名称。

另外一件事,一旦进入 a'['就无法回到高优先级逗号。因此,当语法进入'{','}'部分时,逗号将恢复为高优先级。

为了实现这一点,我有初始默认模式加CONJUNCTION(高优先级)和NON_CONJUNCTION(低优先级)。我从默认模式复制所有规则并将它们重命名为C_NC_。然后我将它们的类型分配回默认模式的类型。

我宁愿在不应对、重命名和为默认模式下的所有规则分配类型的情况下完成此操作。

这是我的词法分析器:

lexer grammar DabarLexer;

OPEN_PAREN : '(' -> pushMode(NON_CONJUNCTION) ;
CLOSE_PAREN : ')' -> popMode;
OPEN_BRACKET : '[' -> pushMode(NON_CONJUNCTION) ;
CLOSE_BRACKET : ']' -> popMode ;
OPEN_CURLY : '{' -> pushMode(CONJUNCTION) ;
CLOSE_CURLY : '}' -> popMode ;
SPACE : ' ' ;
HEAVY_COMMA : ',';
ENDLINE : …
Run Code Online (Sandbox Code Playgroud)

java lexer antlr4

4
推荐指数
1
解决办法
1385
查看次数

ANTLR4 java 解析器可以处理非常大的文件还是可以流式传输文件

ANTLR生成的java解析器能够流式传输任意大的文件吗?

我尝试使用 UnbufferedCharStream 构建 Lexer 并将其传递给解析器。由于调用 UnbufferedCharStream 上的 size,我收到了 UnsupportedOperationException,并且该异常包含一个解释,说明您无法在 UnbufferedCharStream 上调用 size。

    new Lexer(new UnbufferedCharStream( new CharArrayReader("".toCharArray())));
    CommonTokenStream stream = new CommonTokenStream(lexer);
    Parser parser = new Parser(stream);
Run Code Online (Sandbox Code Playgroud)

我基本上有一个使用 Pig 从 hadoop 导出的文件。它有大量由 '\n' 分隔的行。每列由“\t”分隔。这在 java 中很容易解析,因为我使用缓冲读取器来读取每一行。然后我按 '\t' 分割以获得每一列。但我也想要进行某种模式验证。第一列应该是格式正确的日期,后面是一些价格列,然后是一些十六进制列。

当我查看生成的解析器代码时,我可以这样调用它

    parser.lines().line()
Run Code Online (Sandbox Code Playgroud)

这会给我一个列表,从概念上讲我可以对其进行迭代。但当我得到它时,列表似乎已经固定大小了。这意味着解析器可能已经解析了整个文件。

API 的另一部分是否允许您传输非常大的文件?就像使用访问者或侦听器在读取文件时被调用的某种方式一样?但它无法将整个文件保留在内存中。它不适合。

java streaming antlr4

3
推荐指数
1
解决办法
1759
查看次数

标签 统计

antlr4 ×3

java ×2

lexer ×1

maven ×1

streaming ×1