0

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

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

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

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

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

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

我错过了什么吗?

4

2 回答 2

1

没有看到你是如何导入语法的,就不可能说出来。

请记住:

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

在你的情况下,这看起来像:


BaseLexer.g

lexer grammar BaseLexer;

Num   : '0'..'9'+;
Space : ' ' | '\t';

特定词法分析器

lexer grammar SpecificLexer;

import BaseLexer;

SpecificTokenA : 'specificA';
SpecificTokenB : 'specificB';

具体解析器.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 进行了测试。

于 2011-11-17T16:35:18.517 回答
0

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

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

于 2013-03-13T00:03:18.670 回答