2016-08-13 5 views
1

Мы попытались импортировать модуль тестового мошенника и модуль из стандартной библиотеки с помощью JavaToRascal.Как вы можете установить путь поиска для JavaToRascal из Java

Тест модуль хранится в C:\Users\Klemens\workspace\RascalInterop\src\MyTest.rsc и содержит:

module MyTest 

Te код Java, содержащий вызов JavaToRascal выглядит следующим образом:

import java.io.PrintWriter; 
import java.net.URISyntaxException; 

import org.rascalmpl.interpreter.JavaToRascal; 
import org.rascalmpl.interpreter.load.IRascalSearchPathContributor; 
import org.rascalmpl.interpreter.load.StandardLibraryContributor; 
import org.rascalmpl.interpreter.load.URIContributor; 
import org.rascalmpl.uri.URIUtil; 

public class RascalInterop { 
    public static void main(String[] args) throws URISyntaxException { 
     JavaToRascal j2r = new JavaToRascal(new PrintWriter(System.out), new PrintWriter(System.err));   

     IRascalSearchPathContributor modulePath = new URIContributor(URIUtil.createFileLocation("C:\\Users\\Klemens\\workspace\\RascalInterop\\src\\MyTest.rsc"));   
     j2r.getEvaluator().addRascalSearchPathContributor(modulePath); 

     try { 
      j2r.eval("import MyTest;").toString(); // Could not import module MyTest: can not find in search path 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

     try { 
      j2r.getEvaluator().addRascalSearchPathContributor(StandardLibraryContributor.getInstance()); 
      j2r.eval("import IO;").toString(); // null pointer exception 
     } catch (Exception e) { 
      System.out.println(e.getClass()); 
     } 

    } 
} 

Печать в первом блоке Ьгу, который пытается импортировать наш модуль MyTest.rsc приводит к:

Could not import module MyTest: can not find in search path 
?[Advice](http://tutor.rascal-mpl.org/Errors/Static/ModuleImport/ModuleImport.html) 

Второй импорт попытке импортировать IO модуль из стандартных результатов библиотеки в:

class java.lang.NullPointerException 

Любые идеи, как использовать правильно установить путь поиска из программы Java? Мы попытались использовать j2r.getEvaluator().addRascalSearchPathContributor различными способами, но не смогли загрузить модуль MyTest.rsc из данного каталога.

ответ

1

Несмотря на то, что эти API будут изменены в ближайшем будущем (из-за процесса компиляции и связанных с ним изменений), вот ответ. Два ответа на самом деле, один для Rascal файлов и один для Java кода, который он должен

Для Rascal:

j2r.getEvaluator().addRascalSearchPathContributor 

Что вы использовали правильный способ делать вещи. Поэтому, если это не сработало, предоставьте больше кода, чтобы мы могли диагностировать, что пойдет не так. Итак, где ваш модуль? Это в файле jar или двоичной папке? Если это в банке, вам нужна дополнительная проводка, которую я рад объяснить.

Путь поиска Rascal отличается от классов Classpath для Java, которые используются Rascal. Таким образом, для этого у вас есть другой API. Мы используем загрузчик классы, чтобы найти Java файлов (например, что он также работает в ситуации, таких как OSGi расслоение в Eclipse):

Evaluator x = ctx.getEvaluator(); 
x.addClassLoader(getClass().getClassLoader()); 

Это позволит убедиться, что загрузчик класса используется для загрузки текущего класса также используется для загрузки класса связанных в файле Rascal. Конечно, вы также можете предоставить другие загрузчики классов. Обратите внимание, что если библиотеки, на которые вы зависите, загружаются через OSGI, убедитесь, что вы получаете загрузчик классов из класса, который находится в пакете, который имеет доступ к этим классам. Простой случай, когда все находится в одном файле jar, тогда будет выполняться любой загрузчик классов.

+0

Спасибо, что посмотрели на пример. Проблема состоит из двух частей: 1. попытка загрузить самодельный модуль. 2. Попытка загрузить модуль из стандартной библиотеки.Я привел пример, чтобы показать конкретные проблемы. –

1

Я думаю, вы должны изменить путь, чтобы обратиться к src каталог вместо исходного файла:

new URIContributor(URIUtil.createFileLocation("C:\\Users\\Klemens\\workspace\\RascalInterop\\src"));

также: вероятно, вы должны использовать прямую косую черту без C: \, так /Users/.../src

AFAIK Ожидается исключение нулевого указателя, оценка import возвращает null, и вы пытаетесь позвонить toString().

+0

Спасибо за подсказку в каталоге и косую черту, предупреждение ModuleImport не прошло. Однако исключение нулевого указателя происходит в .eval, а не на вызове .toString. Итак, следующие результаты в исключении нулевого указателя: 'IRascalSearchPathContributor modulePath = new URIContributor (URIUtil.createFileLocation (« C:/Users/Klemens/workspace/RascalInterop/src »)); j2r.getEvaluator(). AddRascalSearchPathContributor (modulePath); System.out.println ("Eval: import MyTest;"); j2r.eval ("import MyTest;"); ' –

+0

Можете ли вы добавить stacktrace? Btw, это другой код от ранее (не модуль stdlib). –

Смежные вопросы