2013-11-10 2 views
0

Я хотел бы запустить простой пример анализа Rascal MPL и пытаюсь следовать листингу 1 из инструментального средства Rascal Language Workbench (18531D.pdf) от 3 мая 2011 года. ve загрузил текущую версию MPLS версии 0.5.1 и заметил, что несколько путей модулей были изменены. Ниже показано содержание моего Entities.rsc:Ошибка основного анализа в Rascal MPL Basic Entity Modeling

module tut1::Entities             

extend lang::std::Layout;              
extend lang::std::Id;               
extend Type; 

start syntax Entities               
    = entities: Entity* entities;             
syntax Entity                 
    = @Foldable entity: "entity" Id name "{" Field* "}";       
syntax Field                  
    = field: Symbol Id name; 

Я предполагаю, что здесь то, что было Name и Ident теперь Id; и что было Type сейчас Symbol. Я тогда продолжить следующим образом:

rascal>import tut1::Entities; 
ok 
rascal>import ParseTree; 
ok 

Однако при попытке выполнить важную функцию parse, я получаю ошибки, перечисленные ниже. Где я иду не так? (Несмотря на сообщения Хочу отметить, что я может объявить Symbol переменную в командной строке Rascal.)

rascal>parse(#Entities, "entity Person { string name integer age }"); 
Extending again?? ParseTree 
Extending again?? Type 
expanding parameterized symbols 
generating stubs for regular 
generating literals 
establishing production set 
generating item allocations 
computing priority and associativity filter 
printing the source code of the parser class 
|prompt:///|(22,43,<1,22>,<1,65>): Java("Undeclared non-terminal: Symbol, in class: class org.rascalmpl.java.parser.object.$shell$") 

    org.rascalmpl.parser.gtd.SGTDBF.invokeExpects(SGTDBF.java:139) 
    org.rascalmpl.parser.gtd.SGTDBF.expandStack(SGTDBF.java:864) 
    org.rascalmpl.parser.gtd.SGTDBF.expand(SGTDBF.java:971) 
    org.rascalmpl.parser.gtd.SGTDBF.parse(SGTDBF.java:1032) 
    org.rascalmpl.parser.gtd.SGTDBF.parse(SGTDBF.java:1089) 
    org.rascalmpl.parser.gtd.SGTDBF.parse(SGTDBF.java:1082) 
    org.rascalmpl.interpreter.Evaluator.parseObject(Evaluator.java:493) 
    org.rascalmpl.interpreter.Evaluator.parseObject(Evaluator.java:544) 
    org.rascalmpl.library.Prelude.parse(Prelude.java:1644) 
    org.rascalmpl.library.Prelude.parse(Prelude.java:1637) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2) 
    somewhere in: $shell$ 
+0

Остерегайтесь, это довольно старая версия Rascal! Версия Eclipse лучше поддерживается, но если вы хотите, мы могли бы установить новую версию командной строки – jurgenv

+0

Да, пожалуйста. – user2023370

ответ

1

Примером является вне даты. Что-то, как это будет работать лучше:

module tut1::Entities 

extend lang::std::Layout; // for spaces and such              
extend lang::std::Id;  // for the Id non-terminal              

start syntax Entities               
    = entities: Entity* entities;             
syntax Entity                 
    = @Foldable entity: "entity" Id name "{" Field* "}";       
syntax Field                  
    = field: Id symbol Id name; // now Id is used instead of Symbol and "symbol" is just the name of a slot in the rule 

Некоторые объяснения:

  • импортирует/расширяет пошли, они были нужны и может быть запутанным
  • был недостающее определение для Symbol не- Терминал. Я не знаю, что он должен был делать, но он должен был быть определен syntax Symbol = ..., но это не имело смысла для меня, и вместо этого я повторно использовал Id, чтобы определить тип поля.
  • Контроллер типа (в стадии разработки) предупредил вас перед использованием функции parse.