gpt4 book ai didi

java - 当我在 Antlr 中导入词法分析器时,为什么会收到 NullPointerException?

转载 作者:行者123 更新时间:2023-12-01 15:57:42 25 4
gpt4 key购买 nike

我正在使用 antlr 3 和 Antlrworks。这是我的设置:

lexer Base//包含基本标记 - 如 WS、数字等。

lexer Specific//包含我的语言特定标记 - 并且源自 Base lexer

特定于我的语言的解析器//解析器

组合语法 -> 导入特定的词法分析器和特定的解析器

当我生成时,我总是得到一个 NPE(Java 中)。原因是生成的特定词法分析器中对Base词法分析器的引用没有初始化。

我错过了什么吗?

最佳答案

如果不查看如何导入语法,就无法判断。

请记住:

  • lexer语法只能导入其他lexer语法;
  • 解析器语法只能导入其他解析器语法;
  • tree语法只能导入其他tree语法;
  • 组合语法可以导入词法分析器-解析器语法(但不能其他组合语法!)。

就您而言,这看起来像:

<小时/>

BaseLexer.g

lexer grammar BaseLexer;

Num : '0'..'9'+;
Space : ' ' | '\t';
<小时/>

SpecificLexer.g

lexer grammar SpecificLexer;

import BaseLexer;

SpecificTokenA : 'specificA';
SpecificTokenB : 'specificB';
<小时/>

SpecificParser.g

parser grammar SpecificParser;

specific : SpecificTokenA | SpecificTokenB;
<小时/>

组合.g

grammar Combined;

import SpecificLexer, SpecificParser;

parse
: Num Space specific EOF
{
System.out.println("Parsed:\n Num = " +
$Num.text + "\n specific = " + $specific.text);
}
;
<小时/>

要测试这一切,请使用该类:

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
SpecificLexer lexer = new SpecificLexer(new ANTLRStringStream("42 specificB"));
CombinedParser parser = new CombinedParser(new CommonTokenStream(lexer));
parser.parse();
}
}
<小时/>

现在生成词法分析器和解析器并运行 Main 类:

java -cp antlr-3.3.jar org.antlr.Tool BaseLexer.g
java -cp antlr-3.3.jar org.antlr.Tool SpecificLexer.g
java -cp antlr-3.3.jar org.antlr.Tool SpecificParser.g
java -cp antlr-3.3.jar org.antlr.Tool Combined.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main

这会将以下内容打印到您的控制台:

Parsed:
Num = 42
specific = specificB

还使用 ANTLRWorks 1.4.3 进行了测试。

关于java - 当我在 Antlr 中导入词法分析器时,为什么会收到 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4775691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com