/** * @author Timotei Dolean */ grammar org.wesnoth.WML hidden(EOL, WS, SL_COMMENT) generate wml "http://www.wesnoth.org/WML" import "http://www.eclipse.org/emf/2002/Ecore" as ecore WMLRoot: Expressions += WMLRootExpression*; // Dummy grammar element to act as the super of all WML grammar elements WMLGrammarElement: WMLRoot | WMLValuedExpression | WMLKeyValue | WMLMacroCallParameter ; WMLTag: '[' (plus='+')? name=ID ']' Expressions += WMLExpression* '[/' endName = ID ']' ; WMLKey hidden(WS): name = ID '=' values += WMLKeyValue* (EOL? '+' EOL? values += WMLKeyValue+)* eol+=(EOL|SL_COMMENT); WMLKeyValue: WMLValue | WMLMacroCall | WMLLuaCode | WMLArrayCall; WMLMacroCall: '{' (point='./')? (relative='~')? name=ID Parameters += WMLMacroCallParameter* '}'; WMLMacroCallParameter: WMLMacroParameter | WMLMacroCall; WMLArrayCall: '[' value += WMLValue+ ']' ; WMLMacroDefine: name = DEFINE Expressions += WMLValuedExpression * endName = ENDDEF; WMLPreprocIF: name=(IFDEF | IFNDEF | IFHAVE | IFNHAVE | IFVER | IFNVER) Expressions += WMLValuedExpression * ( Elses = ELSE ElseExpressions += WMLValuedExpression + )? endName = ENDIF; WMLRootExpression: WMLTag | WMLMacroCall | WMLMacroDefine | WMLTextdomain | WMLPreprocIF; WMLExpression: WMLRootExpression | WMLKey ; WMLValuedExpression: WMLExpression | WMLValue; WMLTextdomain: name = TEXTDOMAIN; WMLLuaCode: value = LUA_CODE; WMLMacroParameter: WMLValue | MacroTokens; WMLValue: value = (ID | STRING |'_'|'~' | '.' | './' |'$'|'/' |'(' | ')'| ANY_OTHER); // we use this as a hack for any characters in the macro call // so we won't trigger things like: key=value or [tag] MacroTokens: value = ('='|'['|']'|'+'|'[/'); terminal LUA_CODE : '<<' -> '>>'; // Preprocessor terminals terminal IFHAVE : '#ifhave' !('\n'|'\r')* ('\r'? '\n')?; terminal IFNHAVE : '#ifnhave' !('\n'|'\r')* ('\r'? '\n')?; terminal IFDEF : '#ifdef' !('\n'|'\r')* ('\r'? '\n')?; terminal IFVER : '#ifver' !('\n'|'\r')* ('\r'? '\n')?; terminal IFNVER : '#ifnver' !('\n'|'\r')* ('\r'? '\n')?; terminal IFNDEF : '#ifndef' !('\n'|'\r')* ('\r'? '\n')?; terminal ELSE : '#else' !('\n'|'\r')* ('\r'? '\n')?; terminal ENDIF : '#endif' !('\n'|'\r')* ('\r'? '\n')?; terminal DEFINE : '#define' !('\n'|'\r')* ('\r'? '\n')?; terminal ENDDEF : '#enddef' !('\n'|'\r')* ('\r'? '\n')?; terminal TEXTDOMAIN : '#textdomain' !('\n'|'\r')* ('\r'? '\n')?; // end preprocessor terminals terminal STRING : '"' ( '\\' ('b'|'t'|'n'|'f'|'r'|'"'|"'"|'\\') | !('\\'|'"') )* '"'; terminal ID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-'|',')+; terminal EOL : ('\r'? '\n'); terminal WS : (' '|'\t')+; terminal ANY_OTHER : .; terminal SL_COMMENT : '#' !('\n'|'\r')* ('\r'? '\n')?;