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

发布于 2024-10-13 14:09:26 字数 282 浏览 1 评论 0原文

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

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

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

分析器特定 //我的语言组合语法的解析器

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

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

我错过了什么吗?

I am using antlr 3 and Antlrworks. Here is my setup:

lexer Base //contains basic tokens - like WS, number etc.

lexer Specific //contains my language specific tokens - AND derives from Base lexer

parser specific //parser for my language

combined grammer -> imports specific lexer and specific parser

When I generate, I always get a NPE (in Java). The reason is that the reference to the Base lexer in the generated specific lexer is not initialized.

Am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

埖埖迣鎅 2024-10-20 14:09:26

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

请记住:

  • 词法分析器语法只能导入其他词法分析器语法;
  • parser语法只能导入其他parser语法;
  • 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;

Combined.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 进行了测试。

Impossible to tell without seeing how you're importing the grammars.

Bear in mind that:

  • lexer grammars can only import other lexer grammars;
  • parser grammars can only import other parser grammars;
  • tree grammars can only import other tree grammars;
  • combined grammars can import lexer- and parser grammars (but not other combined grammars!).

In your case, that would look like:


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;

Combined.g

grammar Combined;

import SpecificLexer, SpecificParser;

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

and to test it all, use the class:

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();
  }
}

Now generate the lexers and parsers and run the Main class:

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

which will print the following to your console:

Parsed:
  Num      = 42
  specific = specificB

Also tested with ANTLRWorks 1.4.3.

本王不退位尔等都是臣 2024-10-20 14:09:26

我在使用antlr 3.2时遇到了同样的问题。升级并不简单,因为我面临内存不足问题。

我尝试了不同的解决方案,例如在解析器语法中直接导入两个词法分析器语法,但没有成功。最后,我必须在每个特定词法分析器语法中复制基本词法分析器语法。

I have encountered the same problem using antlr 3.2. Upgrading is not straightforward, because I'm faced with OutOfMemory issues.

I tried different solution, e.g. direct import of both lexer grammars in the parser grammar, without success. In the end I had to copy the Base lexer grammar in every Specific lexer grammar.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文