use of dyvilx.tools.compiler.parser.type.TypeParser in project Dyvil by Dyvil.
the class ThisSuperParser method parse.
@Override
public void parse(IParserManager pm, IToken token) {
final int type = token.type();
switch(this.mode) {
case THIS_SUPER:
switch(type) {
case DyvilKeywords.THIS:
this.mode = TYPE;
this.value = new ThisExpr(token.raw());
return;
case DyvilKeywords.SUPER:
this.mode = TYPE;
this.value = new SuperExpr(token.raw());
return;
}
pm.popParser(true);
return;
case TYPE:
if (ExpressionParser.isGenericCall(token, type)) {
this.mode = TYPE_END;
pm.splitJump(token, 1);
pm.pushParser(new TypeParser(this.value, true));
return;
}
this.valueConsumer.setValue(this.value);
pm.popParser(true);
return;
case TYPE_END:
pm.popParser();
this.valueConsumer.setValue(this.value);
if (!TypeParser.isGenericEnd(token, type)) {
pm.reparse();
pm.report(token, this.value.valueTag() == IValue.SUPER ? "super.close_angle" : "this.close_angle");
return;
}
pm.splitJump(token, 1);
}
}
use of dyvilx.tools.compiler.parser.type.TypeParser in project Dyvil by Dyvil.
the class TypeClassParser method parse.
@Override
public void parse(IParserManager pm, IToken token) {
final int type = token.type();
switch(this.mode) {
case TYPE_CLASS:
if (type == DyvilKeywords.CLASS) {
this.value = new ClassOperator(token.raw());
this.mode = TYPE;
return;
}
if (type == DyvilKeywords.TYPE) {
this.value = new TypeOperator(token.raw());
this.mode = TYPE;
return;
}
throw new Error();
case TYPE:
if (TypeParser.isGenericStart(token, type)) {
this.mode = ANGLE_END;
pm.splitJump(token, 1);
pm.pushParser(new TypeParser(this.value, true));
return;
}
if (type == BaseSymbols.OPEN_PARENTHESIS) {
this.mode = PARENTHESES_END;
} else {
this.mode = END;
pm.reparse();
}
pm.pushParser(new TypeParser(this.value));
return;
case PARENTHESES_END:
if (type != BaseSymbols.CLOSE_PARENTHESIS) {
pm.report(token, this.isClassOperator() ? "classoperator.close_paren" : "typeoperator.close_paren");
return;
}
this.valueConsumer.setValue(this.value);
pm.popParser();
return;
case ANGLE_END:
if (!TypeParser.isGenericEnd(token, type)) {
pm.report(token, this.isClassOperator() ? "classoperator.close_angle" : "typeoperator.close_angle");
return;
}
this.valueConsumer.setValue(this.value);
pm.popParser();
pm.splitJump(token, 1);
return;
case END:
this.valueConsumer.setValue(this.value);
pm.popParser(true);
}
}
use of dyvilx.tools.compiler.parser.type.TypeParser in project Dyvil by Dyvil.
the class TypeAliasParser method parse.
@Override
public void parse(IParserManager pm, IToken token) {
int type = token.type();
switch(this.mode) {
case END:
this.map.addTypeAlias(this.typeAlias);
pm.popParser(true);
return;
case TYPE:
this.mode = NAME;
if (type != DyvilKeywords.TYPE) {
pm.reparse();
pm.report(token, "typealias.type");
}
return;
case NAME:
if (Tokens.isIdentifier(type)) {
Name name = token.nameValue();
this.typeAlias = new TypeAlias(name, token.raw());
this.mode = TYPE_PARAMETERS;
return;
}
pm.popParser();
pm.report(token, "typealias.identifier");
return;
case TYPE_PARAMETERS:
if (TypeParser.isGenericStart(token, type)) {
this.mode = TYPE_PARAMETERS_END;
pm.splitJump(token, 1);
pm.pushParser(new TypeParameterListParser(this.typeAlias));
return;
}
// Fallthrough
case EQUAL:
this.mode = END;
pm.pushParser(new TypeParser(this.typeAlias));
if (type != BaseSymbols.EQUALS) {
pm.reparse();
pm.report(token, "typealias.equals");
}
return;
case TYPE_PARAMETERS_END:
this.mode = EQUAL;
if (TypeParser.isGenericEnd(token, type)) {
pm.splitJump(token, 1);
return;
}
pm.reparse();
pm.report(token, "generic.close_angle");
}
}
use of dyvilx.tools.compiler.parser.type.TypeParser in project Dyvil by Dyvil.
the class ParameterListParser method parse.
@Override
public void parse(IParserManager pm, IToken token) {
final int type = token.type();
switch(this.mode) {
case DECLARATOR:
switch(type) {
case BaseSymbols.SEMICOLON:
if (token.isInferred()) {
return;
}
break;
case DyvilKeywords.LET:
this.attributes.addFlag(Modifiers.FINAL);
// Fallthrough
case DyvilKeywords.VAR:
this.mode = NAME;
return;
case DyvilKeywords.THIS:
if (token.next().type() != BaseSymbols.COLON) {
pm.report(token, "parameter.identifier");
this.mode = SEPARATOR;
return;
}
// this : TYPE
this.mode = TYPE_ASCRIPTION;
// the colon
pm.skip();
pm.pushParser(new TypeParser(t -> this.setThisType(t, token, pm)));
return;
case DyvilSymbols.AT:
final Annotation annotation = new CodeAnnotation(token.raw());
this.attributes.add(annotation);
pm.pushParser(new AnnotationParser(annotation));
return;
}
final Modifier modifier;
if ((modifier = ModifierParser.parseModifier(token, pm)) != null) {
this.attributes.add(modifier);
return;
}
if (BaseSymbols.isCloseBracket(type)) {
pm.popParser(true);
return;
}
// Fallthrough
case NAME:
final Name name;
if (Tokens.isIdentifier(type)) {
name = token.nameValue();
} else if (type == BaseSymbols.UNDERSCORE) {
name = null;
} else if (Tokens.isKeyword(type)) {
name = Name.fromRaw(token.stringValue());
} else {
if (BaseSymbols.isCloseBracket(type)) {
pm.popParser(true);
}
if (type == Tokens.EOF) {
pm.popParser();
}
this.mode = SEPARATOR;
pm.report(token, "parameter.identifier");
return;
}
this.parameter = this.consumer.createParameter(token.raw(), name, this.type, this.attributes);
this.mode = INTERNAL_NAME;
return;
case INTERNAL_NAME:
this.mode = VARARGS_AFTER_NAME;
// overwrite the internal name if necessary
if (Tokens.isIdentifier(type)) {
// IDENTIFIER IDENTIFIER : TYPE
this.parameter.setName(token.nameValue());
return;
} else if (type == BaseSymbols.UNDERSCORE) {
// IDENTIFIER _ : TYPE
this.parameter.setName(null);
return;
}
// Fallthrough
case VARARGS_AFTER_NAME:
if (type == DyvilSymbols.ELLIPSIS) {
this.flags |= VARARGS;
this.mode = TYPE_ASCRIPTION;
return;
}
// Fallthrough
case TYPE_ASCRIPTION:
case VARARGS_AFTER_POST_TYPE:
// continue with the remaining cases (DEFAULT_VALUE, PROPERTY, ...).
if (this.mode == VARARGS_AFTER_POST_TYPE) {
// case (2)
if (type == DyvilSymbols.ELLIPSIS) {
this.setTypeVarargs();
this.mode = DEFAULT_VALUE;
return;
}
} else /* case (1) */
if (type == BaseSymbols.COLON) {
this.mode = VARARGS_AFTER_POST_TYPE;
final TypeParser parser = new TypeParser(this);
if (this.hasFlag(LAMBDA_ARROW_END)) {
parser.withFlags(TypeParser.IGNORE_LAMBDA);
}
pm.pushParser(parser);
return;
}
// Fallthrough
case DEFAULT_VALUE:
if (type == BaseSymbols.EQUALS) {
this.mode = PROPERTY;
pm.pushParser(new ExpressionParser(this.parameter));
return;
}
// Fallthrough
case PROPERTY:
if (type == BaseSymbols.OPEN_CURLY_BRACKET && this.hasFlag(ALLOW_PROPERTIES)) {
final IProperty property = this.parameter.createProperty();
pm.pushParser(new PropertyBodyParser(property), true);
this.mode = SEPARATOR;
return;
}
// Fallthrough
case SEPARATOR:
this.mode = DECLARATOR;
if (this.parameter != null) {
if (this.hasFlag(VARARGS)) {
this.parameter.setVarargs();
}
this.parameter.setType(this.type);
this.consumer.getParameters().add(this.parameter);
}
this.reset();
switch(type) {
case DyvilSymbols.ARROW_RIGHT:
case DyvilSymbols.DOUBLE_ARROW_RIGHT:
if (!this.hasFlag(LAMBDA_ARROW_END)) {
// produce a syntax error
break;
}
// Fallthrough
case BaseSymbols.CLOSE_PARENTHESIS:
case BaseSymbols.CLOSE_CURLY_BRACKET:
case BaseSymbols.CLOSE_SQUARE_BRACKET:
pm.reparse();
// Fallthrough
case Tokens.EOF:
pm.popParser();
return;
case BaseSymbols.COMMA:
case BaseSymbols.SEMICOLON:
return;
}
pm.report(token, "parameter.separator");
}
}
use of dyvilx.tools.compiler.parser.type.TypeParser in project Dyvil by Dyvil.
the class AnnotationParser method parse.
@Override
public void parse(IParserManager pm, IToken token) {
final int type = token.type();
switch(this.mode) {
case NAME:
this.annotation.setPosition(token.prev());
pm.pushParser(new TypeParser(this.annotation), true);
this.mode = PARAMETERS_START;
return;
case PARAMETERS_START:
this.annotation.expandPosition(token.prev());
if (type == BaseSymbols.OPEN_PARENTHESIS) {
ArgumentListParser.parseArguments(pm, token.next(), this.annotation);
this.mode = PARAMETERS_END;
return;
}
pm.popParser(true);
return;
case PARAMETERS_END:
if (type != BaseSymbols.CLOSE_PARENTHESIS) {
pm.reparse();
pm.report(token, "annotation.parenthesis");
}
pm.popParser();
}
}
Aggregations