Вопрос

I'd like to run through a simple Rascal MPL parsing example, and am trying to follow Listing 1 from the Rascal Language Workbench (18531D.pdf) of May 3rd 2011. I've downloaded the current Rascal MPL version 0.5.1, and notice that a few module paths have changed. The following shows the content of my Entities.rsc:

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;

I'm assuming here that what was Name and Ident is now Id; and what was Type is now Symbol. I then continue as follows:

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

However, when I attempt to execute the crucial parse function, I receive the errors listed below. Where am I going wrong? (Despite the message I note that I can declare a Symbol variable at the Rascal prompt.)

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$
Это было полезно?

Решение

The example is out-of-date. Something like this would work better:

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

Some explanation:

  • the imports/extends have gone, they were unnecessary and might be confusing
  • there was a missing definition for the Symbol non-terminal. I don't know what it was supposed to do, but it should have been defined syntax Symbol = ..., but it did not make sense to me and instead I reused Id to define the type of a field.
  • the type checker (under development) would have warned you before using the parse function.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top