Skip to content

Instantly share code, notes, and snippets.

@nbhusare
Created April 26, 2021 15:09
Show Gist options
  • Save nbhusare/e4a1d8d59ca7424dcde6d3cee80a6c73 to your computer and use it in GitHub Desktop.
Save nbhusare/e4a1d8d59ca7424dcde6d3cee80a6c73 to your computer and use it in GitHub Desktop.
XBase - Adding the support for 'repeat X times Y' syntax
@Override
XPrimaryExpression returns xbase::XExpression:
super |
XRepeatExpression;
XRepeatExpression returns xbase::XExpression:
{XRepeatExpression} 'repeat' numTimes=INT 'times' expression=XExpression;
------------------------------------------------------------------------
public class ModelDslTypeComputer extends XbaseTypeComputer {
@Override
public void computeTypes(XExpression expression, ITypeComputationState state) {
if (expression instanceof XRepeatExpression) {
XRepeatExpression repeatExpression = (XRepeatExpression) expression;
ITypeComputationState eachState = state.withoutExpectation();
eachState.computeTypes(repeatExpression.getExpression());
LightweightTypeReference primitiveVoid = getPrimitiveVoid(state);
state.acceptActualType(primitiveVoid);
} else {
super.computeTypes(expression, state);
}
}
}
---------------------------------------------------------------------------
public class ModelDslCompiler extends XbaseCompiler {
private void _toJavaStatement(XRepeatExpression expr, ITreeAppendable b, boolean isReferenced) {
internalToJavaStatement(expr.getExpression(), b, true);
b.newLine();
ITreeAppendable loopAppendable = b.trace(expr);
loopAppendable.append("for (int i=0; i < " + expr.getNumTimes() + "; i++");
loopAppendable.append(") {").increaseIndentation();
internalToJavaStatement(expr.getExpression(), loopAppendable, false);
loopAppendable.decreaseIndentation().newLine().append("}");
}
@Override
protected void doInternalToJavaStatement(XExpression expression, ITreeAppendable appendable, boolean isReferenced) {
if (expression instanceof XRepeatExpression) {
_toJavaStatement((XRepeatExpression) expression, appendable, isReferenced);
} else {
super.doInternalToJavaStatement(expression, appendable, isReferenced);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment