Created
April 26, 2021 15:09
-
-
Save nbhusare/e4a1d8d59ca7424dcde6d3cee80a6c73 to your computer and use it in GitHub Desktop.
XBase - Adding the support for 'repeat X times Y' syntax
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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