1: 
     2: doctype public "-//IDN etl.sf.net//ETL//Grammar 0.2.1";
     3: /// This abstract grammar contains definition of some 
     4: /// common operators. This grammar intentionally leaves out
     5: /// assignment operators, literals, and value creation operators.
     6: grammar abstract net.sf.etl.samples.ej.CommonOperators {
     7: 	namespace c = "http://etl.sf.net/2006/samples/ej/0.1";
     8: 	context abstract CommonOperators {
     9: 		op UnaryMinusOp(fy, 200, -) {
    10: 			^ c:UnaryMinusOp {
    11: 				@ value = right;
    12: 			};
    13: 		};
    14: 		op UnaryPlusOp(fy, 200, +) {
    15: 			^ c:UnaryPlusOp {
    16: 				@ value = right;
    17: 			};
    18: 		};
    19: 		op MultiplyOp(yfx, 400, *) {
    20: 			^ c:MultiplyOp {
    21: 				@ multipliers += left;
    22: 				@ multipliers += right;
    23: 			};
    24: 		};
    25: 		op DivideOp(yfx, 400, /) {
    26: 			^ c:DivideOp {
    27: 				@ dividend = left;
    28: 				@ divisor = right;
    29: 			};
    30: 		};
    31: 		op RemainderOp(yfx, 400, %) {
    32: 			^ c:RemainderOp {
    33: 				@ dividend = left;
    34: 				@ divisor = right;
    35: 			};
    36: 		};
    37: 		op PlusOp(yfx, 500, +) {
    38: 			^ c:PlusOp {
    39: 				@ summands += left;
    40: 				@ summands += right;
    41: 			};
    42: 		};
    43: 		op MinusOp(yfx, 500, -) {
    44: 			^ c:MinusOp {
    45: 				@ minuend = left;
    46: 				@ subtrahend = right;
    47: 			};
    48: 		};
    49: 		op LeftShiftOp(yfx, 600, <<) {
    50: 			^ c:LeftShiftOp {
    51: 				@ value = left;
    52: 				@ distance = right;
    53: 			};
    54: 		};
    55: 		op RightShiftOp(yfx, 600, >>) {
    56: 			^ c:RightShiftOp {
    57: 				@ value = left;
    58: 				@ distance = right;
    59: 			};
    60: 		};
    61: 		op ZeroExtensionRightShiftOp(yfx, 600, >>>) {
    62: 			^ c:ZeroExtensionRightShiftOp {
    63: 				@ value = left;
    64: 				@ distance = right;
    65: 			};
    66: 		};
    67: 		op BitwiseComplementOp(fy, 200, ~) {
    68: 			^ c:BitwiseComplementOp {
    69: 				@ value = right;
    70: 			};
    71: 		};
    72: 		op LogicalComplementOp(fy, 200, !) {
    73: 			^ c:LogicalComplementOp {
    74: 				@ value = right;
    75: 			};
    76: 		};
    77: 		op BitwiseAndOp(yfx, 900, &) {
    78: 			^ c:BitwiseAndOp {
    79: 				@ value1 = left;
    80: 				@ value2 = right;
    81: 			};
    82: 		};
    83: 		op BitwiseXorOp(yfx, 1000, ^) {
    84: 			^ c:BitwiseXorOp {
    85: 				@ value1 = left;
    86: 				@ value2 = right;
    87: 			};
    88: 		};
    89: 		op BitwiseOrOp(yfx, 1100, |) {
    90: 			^ c:BitwiseOrOp {
    91: 				@ value1 = left;
    92: 				@ value2 = right;
    93: 			};
    94: 		};
    95: 		op ConditionalAndOp(yfx, 1200, &&) {
    96: 			^ c:ConditionalAndOp {
    97: 				@ value1 = left;
    98: 				@ value2 = right;
    99: 			};
   100: 		};
   101: 		op ConditionalOrOp(xfx, 1300, ||) {
   102: 			^ c:ConditionalOrOp {
   103: 				@ value1 = left;
   104: 				@ value2 = right;
   105: 			};
   106: 		};
   107: 		op LessThenOp(xfx, 700, <) {
   108: 			^ c:LessThenOp {
   109: 				@ value1 = left;
   110: 				@ value2 = right;
   111: 			};
   112: 		};
   113: 		op LessOrEqualOp(yfx, 700, <=) {
   114: 			^ c:LessOrEqualOp {
   115: 				@ value1 = left;
   116: 				@ value2 = right;
   117: 			};
   118: 		};
   119: 		op GreaterThenOpOp(yfx, 700, >) {
   120: 			^ c:GreaterThenOp {
   121: 				@ value1 = left;
   122: 				@ value2 = right;
   123: 			};
   124: 		};
   125: 		op GreaterOrEqualOp(yfx, 700, >=) {
   126: 			^ c:GreaterOrEqualOp {
   127: 				@ value1 = left;
   128: 				@ value2 = right;
   129: 			};
   130: 		};
   131: 		op EqualOp(xfx, 800, ==) {
   132: 			^ c:EqualOp {
   133: 				@ value1 = left;
   134: 				@ value2 = right;
   135: 			};
   136: 		};
   137: 		op NotEqualOp(xfx, 800, !=) {
   138: 			^ c:NotEqualOp {
   139: 				@ value1 = left;
   140: 				@ value2 = right;
   141: 			};
   142: 		};
   143: 		op composite ConditionalOp(xfy, 1400) {
   144: 			^ c:ConditionalOp {
   145: 				@ condition = left;
   146: 				% ? {
   147: 					@ thenPart = expression;
   148: 					% :{
   149: 					};
   150: 				};
   151: 				@ elsePart = right;
   152: 			};
   153: 		};
   154: 	};
   155: };