public BaseExpression Parse(string source) { var tokenizer = new Tokenizer(); var tokens = tokenizer.Read(source); var queue = new TokensQueue(tokens); return Parse(queue); }
protected IList<Token> LoadRecursive(string content, IList<Token> result, string fileName = null) { var tokenizer = new Tokenizer(); var fileTokens = tokenizer.Read(new FileSource { FileName = fileName, Content = content }); for (var i = 0; i < fileTokens.Count; ) { var token = fileTokens[i++]; if (token.Type == TokenType.Literal && token.StringValue == "include") { if (i >= fileTokens.Count) { throw new TokenException("file name expected", token); } var nameToken = fileTokens[i++]; if (nameToken.Type != TokenType.String) { throw new TokenException("file name expected", token); } if (i < fileTokens.Count) { var nlToken = fileTokens[i++]; if (nlToken.Type != TokenType.NewLine) { throw new TokenException("extra characters on line", token); } } var path = _source.ResolveFile(nameToken.StringValue, fileName); if (string.IsNullOrWhiteSpace(path)) throw new TokenException("file is not found " + nameToken.StringValue, token); var otherContent = _source.LoadContent(path); LoadRecursive(otherContent, result, nameToken.StringValue); result.Add(new Token { Type = TokenType.NewLine }); } else { i--; CopyLine(fileTokens, result, ref i); } } return result; }