public BaseExpression Parse(string source)
 {
     var tokenizer = new Tokenizer();
     var tokens = tokenizer.Read(source);
     var queue = new TokensQueue(tokens);
     return Parse(queue);
 }
Exemple #2
0
        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;
        }