在Antlr中导入词法分析器时,为什么会出现NullPointerException?

2020年1月31日 13点热度 0条评论

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

lexer Base //包含基本令牌-如WS,数字等。

特定于词法分析器//包含我的语言特定标记-AND衍生自基本词法分析器

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

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

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

我想念什么吗?

解决方案如下:

在看不到语法导入的情况下无法说出。

请记住:

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

在您的情况下,它看起来像:

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;

合并

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