Почему я получаю исключение NullPointerException при импорте лексеров в Antlr?

Я использую antlr 3 и Antlrworks. Вот моя установка:

lexer Base //содержит базовые токены - такие как WS, число и т.д.

lexer Specific //содержит токены, характерные для моего языка - И происходит от базового лексера

специфичный для синтаксического анализатора //парсер для моего языка

комбинированный грамматик -> импортирует конкретный лексер и конкретный парсер

Когда я генерирую, я всегда получаю NPE (на Java). Причина в том, что ссылка на базовый лексер в сгенерированном конкретном лексере не инициализирована.

Я что-то упускаю?


person Dhan    schedule 23.01.2011    source источник
comment
Спасибо, что написали. Генерирую через ANTLRWorks.   -  person Dhan    schedule 25.01.2011


Ответы (2)


Невозможно сказать, не видя, как вы импортируете грамматики.

Имейте в виду, что:

  • Грамматики 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';

КонкретныйParser.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.

person Bart Kiers    schedule 17.11.2011

Я столкнулся с той же проблемой, используя antlr 3.2. Обновление не является простым, потому что я столкнулся с проблемами OutOfMemory.

Я пробовал другое решение, например. прямой импорт обеих грамматик лексера в грамматику анализатора безуспешно. В конце концов мне пришлось скопировать грамматику базового лексера в каждую конкретную грамматику лексера.

person Nicola Musatti    schedule 13.03.2013