2013-03-14 79 views
4

我有一个语法称为leach.xtext,当我把这个成的Xtext在我的文件myDsl.xtext我收到以下错误:如何解决“生成的包不能为空”的错误

Generated package 'leach' may not be empty.

通过查看其他的例子,他们都在xtext文件的开头添加了一些“规则”,然后指向语法中的第一条原始规则。但我不明白该怎么做。下面是整个语法,尽管我认为只有前几行应该是相关的。

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals 

generate leach "http://www.xtext.org/example/mydsl/MyDsl" //error appears here.. 

start : ('Prepare' ':' '{' ingredients '}')+ (procdef) cook; 
cook : 'Cook' ID ':' '{' instructions serve ';' '}'; 

ingredients : ingredient (',' ingredient)*; 
ingredient : amount food; 
quality : 'large' | 'sliced' | 'finelySliced' | 'chopped' | 'fresh' | 'grated' | 
      'ground' | 'unsalted' | 'fluffy' | 'goldenBrown' ; 

amount : INT (unit); 
unit : 'l' | 'ml' | 'cl' | 'oz' | 'g' | 'kg' | 'tesp' | 'tbsp'; 

temperature : INT heat; 
heat : 'c' | 'f'; 

tlength : tunit '(' INT ')'; 
tunit : 'sec' | 'min'; 

hobheat : 'LOW' | 'MEDIUM' | 'HIGH'; 
hob : 'hob1' | 'hob2' | 'hob3' | 'hob4'; 

food : 'cookingApples' | 'sugar' | 'shortcrustPastry' | 'wensleydaleCheese' | 'whippedCream' | 
    'bacon' | 'redOnion' | 'doubleCream' | 'flatleatParsley' | 'parmesan' | 'greenSalad' | 
    'tomatoKetchup' | 'blackPepper' | 'goldenSyrup' | 'vanillaExtract' | 'brownSugar' | 'eggs' | 
    'pecanNuts' | 'lard' | 'vegetableOil' | 'butter' | 'readyPastry' | 'salt' | ID ; 

instructions : (instruction); 
instruction : 'if' '(' expr ')' '{' instructions '}' ('else' '{' instructions '}') | 
    whil '(' expr ')' '{' instructions '}' | 
    'do' '{' instructions '}' whil '(' expr ')' | 
    process ';' | 
    assign ';' | 
    cook; 

whil : 'while' | 'until'; 
assign : 'set' varname '=' expr; 
varname : '@' ID; 

process : 'Preheat' '(' temperature ')' | 
    'AddToOven' '(' container ')' | 
    'Slice' '(' food ',' amount ')' | 
    'RemoveFromHeat' '(' container ')' | 
    'Drain' '(' container ')' | 
    'Grease' '(' container ',' food ')' | 
    'Layer' '(' container ',' food ')' | 
    'SetHeat' '(' ((hobheat ',' hob) | temperature) ')' | 
    'Whisk' '(' container ')' | 
    'Stir' '(' container ')' | 
    'AddTo' '(' container ',' food ',' amount ')' | 
    'PutOnHub' '(' container ',' hob ')' | 
    'Wait' '(' (expr | tlength)+ ')' | 
    'EmptyTo' '(' container ',' container ')' | 
    'MoveTo' '(' container ',' food ',' amount ')' | 
    '~' ID '(' (expr (',' expr)) ')' ; 

procdef : 'function' ID '(' (expr (',' expr)) ')' block; 
block : '{' instructions (retur)? '}'; 
serve : 'serve' (container | '@'ID); 
retur : 'return' expr ';' ; 

container : 'bowl' | 'saucePan' | 'fryingPan' | 'bakingTray' | 'pieDish' | 'plate'; 
expr : e1 ('~~' e1 | 
    '<' e1 | 
    '<=' e1 | 
    '>' e1 | 
    '>=' e1 | 
    '==' e1 | 
    '!=' e1)*; 

e1 : e2 ('^' e2)*; 



e2 : e3 ('|' e3)*; 
    e3 : e4 ('&' e4)*; 
    e4 : e5 ('+' e5 | '-' e5)*; 
    e5 : e6 ('*' e6 | '/' e6 | '&' e6)*; 
    e6 : ('!') e7; 
    e7 : e8 ('**' e7); 
    e8 : 'true' | 'false' | INT | quality | food | container | process | '(' expr ')'; 

回答

4

您的语法看起来不像一个合理的有效Xtext语法。您的所有规则都是数据类型规则,因此不会推断产生错误消息的类型。请查看手册,特别是关于作业的部分。

你的语法或许应该开始沿着这些路线的东西:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals 

generate leach "http://www.xtext.org/example/mydsl/MyDsl" //error appears here.. 

Start : ('Prepare' ':' '{' ingredients+=Ingredients '}')+ (def=Procdef) cook=Cook; 
Cook : 'Cook' name=ID ':' '{' instructions=Instructions serve=Serve ';' '}'; 

Ingredients : ingredients+=Ingredient (',' ingredients+=Ingredient)*; 

请不是规则通常以大写字母开始,你必须使用分配,例如=+=,以便从输入中产生适当的AST。

+0

您确定吗?因为它与我通过一些讲义呈现的非常相似。 – DSF 2013-03-15 02:32:52

+0

是的,我很确定 - 我实现了EPackage推理和约束条件;-)你从哪里学习讲义? – 2013-03-15 08:26:31

+0

哦,大声笑,没有和你争吵;) 这是从我的大学课程。你介意只写出他们应该在的前几行吗?谢谢 – DSF 2013-03-15 08:42:37

相关问题