Parsing Predecesors
@Override let value = getValue()
@generate(get, set)
@log
let doSomething = ...public class AnnotationParselet : IPrefixParselet
{
public AstNode Parse(Parser parser, Token token)
{
var call = parser.ParseExpression();
if (call is NameNode name) //to allow annotations without arguments we convert a name into a call
{
call = new CallNode(call, []);
}
if (call is not CallNode node) //make sure we do not have something like literals
{
call.AddMessage(MessageSeverity.Error, "Annotation can only be a name or call");
return new InvalidNode(token).WithRange(token, parser.LookAhead(0));
}
var expr = parser.ParseExpression(); //parses the expression that we wanna annotate
if (expr is AnnotatedNode a)
{
a.Annotations = a.Annotations.Add(node);
}
else
{
expr.AddMessage(MessageSeverity.Error, "Annotation cannot be used for " + expr.GetType());
}
return expr;
}
}Last updated