private void ParseStatement(MapParserContext context, MapLexer lexer) { // Constructs: // examples ... // ignore ... // with ... // { statements } if (lexer.Token.Kind == TokenKind.Keyword) { if (lexer.Token.Text == "with") { ParseWith(context, lexer); return; } else if (lexer.Token.Text == "name") { ParseName(context, lexer); return; } else if (lexer.Token.Text == "examples") { ParseExamples(context, lexer); return; } else if (lexer.Token.Text == "ignore") { ParseIgnore(context, lexer); return; } else { throw new ParserException($"Unexpected keyword '{lexer.Token.Text}'.", lexer.Token); } } else if (lexer.Token.Kind == TokenKind.LeftCurly) { lexer.Consume(TokenKind.LeftCurly); while (lexer.Token.Kind != TokenKind.RightCurly) { ParseStatement(context, lexer); } lexer.Consume(TokenKind.RightCurly); return; } // Constructs: // ident = model(ident); // ident:ident = ident:ident; var lhs = CompoundIdentifier.Parse(lexer); lexer.Consume(TokenKind.Equals); var rhs = expressionParser.Parse(lexer, context); // A little special handling for the model function if (rhs.FunctionName == "model") { var model = rhs.Arguments.First().Model; if (model == null) { throw new ParserException("The 'model' function requires a model argument."); } context.AddModelAlias(lhs.Parts.First(), model); lexer.Consume(TokenKind.Semicolon); } else { var target = context.Resolve(lhs); var mapCount = context.MapList.Maps.Where(x => x.TargetAttribute.Equals(target)).Count(); var mapping = new ExpressiveMapping(IdNames.Substring(mapCount, 1), target, rhs); context.MapList.Maps.Add(mapping); if (lexer.Token.Kind == TokenKind.LeftCurly) { ParseMappingExtras(context, lexer, mapping); } else { lexer.Consume(TokenKind.Semicolon); } } }
public void AddAlias(string alias, CompoundIdentifier expansion) { aliases.Add(alias, expansion); }