How to resolve the error "the generated package may be empty"

I have a grammar called leach.xtext , and when I put it in the Xtext in my myDsl.xtext file, I get the following error:

The generated leach packet may be empty.

Studying other examples, they all add some β€œrule” at the beginning of the xtext file, which then points to the first source rule in the grammar. But I do not understand how to do this. Below is the whole grammar, although I think that only the first few lines should be relevant.

 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
source share
1 answer

Your grammar is not like reasonable Xtext grammar. All your rules are data type rules, so no types are output, which gives an error message. Please read the manual, especially in the section on appointments.

Your grammar should probably start with something in this direction:

 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)*; 

Please do not follow the rules that usually start with a capital letter and that you need to use assignments, for example. = and += to get the correct AST from the input.

+4
source

Source: https://habr.com/ru/post/1469131/


All Articles