java Main <inputfile не работает (Main - это Java-класс для проверки грамматики ANTLR) - PullRequest
2 голосов
/ 05 ноября 2011

Я пытаюсь протестировать грамматику ANTLR с помощью такой стандартной тестовой установки

import org.antlr.runtime.*;

 class Main {
  public static void main(String[] args) throws Exception {
    SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0]));
    SampleParser parser = new SampleParser(new CommonTokenStream(lexer));
    parser.program();
  }
}

У меня есть тестовый файл mytest00.Теперь я хочу использовать этот файл в качестве входных данных.Я предполагаю, что я делаю перенаправление стандартного ввода-вывода здесь.

   bash-3.2$ java Main < mytest00

Но выдает такое сообщение об ошибке.В чем проблема, пожалуйста?Благодарю.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at Main.main(SampleTest.java:5)

Ответы [ 3 ]

4 голосов
/ 05 ноября 2011

Вы пытаетесь использовать args[0], но на самом деле вы не передали ни одного аргумента командной строки - вы просто перенаправили файл на стандартный ввод процесса.Таким образом, массив не имеет элементов, и вы получаете исключение, потому что пытаетесь получить первый элемент этого пустого массива.

Не совсем понятно, что вы на самом деле хотите ANTLRStringStream.Я подозреваю, что вы хотите ANTLRInputStream упаковка System.in, если args.length == 0, и ANTLRFileStream(args[0]) в противном случае.

2 голосов
/ 05 ноября 2011

Что означает исключение и как обычно обращаться с исключениями

at Main.main(SampleTest.java:5)

Проблема появляется в 5 строках вашего кода, а именно:

SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0]));

и исключение:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

, что означает, что вы пытаетесь извлечь 0-элемент из вашего массива args, к массиву обращались с недопустимым индексом, потому что массив пуст (size =0)


Пример решения

Вы хотите использовать этот конструктор:

public ANTLRStringStream(String str)

Для этого вы можете:

  1. чтение стандартного ввода для некоторой строки
  2. передача этой строки в ANTLRStringStream конструктор
2 голосов
/ 05 ноября 2011

когда вы используете < в качестве параметра, ОС рассматривает его как перенаправление ввода. поэтому он проверит это и не передаст аргумент java main()

...