Почему я получаю исключение NullPointerException при импорте лексеров в Antlr? - PullRequest
0 голосов
/ 23 января 2011

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

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

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

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

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

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

Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

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

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

  • лексер грамматики могут импортировать только другие лексер грамматики;
  • парсер грамматики могут импортировать только другие парсер грамматики;
  • дерево грамматики могут импортировать только другие дерево грамматики;
  • комбинированные грамматики могут импортировать лексер - и парсер грамматики (но не другие комбинированные грамматики!).

В вашем случае это будет выглядеть так:


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

и для проверки всего этого используйте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();
  }
}

Теперь сгенерируйте лексеры и парсеры и запустите класс 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.

0 голосов
/ 13 марта 2013

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

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

...