コード例 #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="LispVariant"/> class.
        /// </summary>
        /// <param name="val">The value.</param>
        /// <param name="unQuoted">The unquoted modus.</param>
        public LispVariant(object val, LispUnQuoteModus unQuoted /*= LispUnQuoteModus.None*/)
            : this(TypeOf(val), val, unQuoted)
        {
            var value = val as LispVariant;

            if (value != null)
            {
                Type       = value.Type;
                Value      = value.Value;
                IsUnQuoted = value.IsUnQuoted;
            }
        }
コード例 #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LispVariant"/> class.
 /// </summary>
 /// <param name="token">The token.</param>
 /// <param name="unQuoted">The unquoted modus.</param>
 internal LispVariant(LispToken token, LispUnQuoteModus unQuoted = LispUnQuoteModus.None)
     : this(TypeOf(token.Value), token.Value, unQuoted)
 {
     Token = token;
     if (token.Type == LispTokenType.Nil)
     {
         Type = LispType.Nil;
     }
     if (token.Type == LispTokenType.Symbol)
     {
         Type = LispType.Symbol;
     }
 }
コード例 #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LispVariant"/> class.
 /// </summary>
 /// <param name="type">The type.</param>
 /// <param name="value">The value.</param>
 /// <param name="unQuoted">The unquoted modus.</param>
 public LispVariant(LispType type = LispType.Undefined, object value = null, LispUnQuoteModus unQuoted = LispUnQuoteModus.None)
 {
     Type       = type;
     Value      = value;
     IsUnQuoted = unQuoted;
 }
コード例 #4
0
ファイル: LispParser.cs プロジェクト: maze516/fuel-lang
        private static int ParseTokens(string moduleName, IList <LispToken> tokens, int startIndex, ref object parseResult, bool isToplevel)
        {
            int           i;
            List <object> current   = null;
            var           listStack = new Stack <List <object> >();

            for (i = startIndex; i < tokens.Count; i++)
            {
                LispToken token = tokens[i];
                if (token.Type == LispTokenType.ListStart)
                {
                    current = new List <object>();
                    listStack.Push(current);
                }
                else if (token.Type == LispTokenType.ListEnd)
                {
                    var temp = current;
                    listStack.Pop();
                    if (listStack.Count > 0)
                    {
                        listStack.Peek().Add(temp);
                        current = listStack.Peek();
                    }
                    else
                    {
                        if (isToplevel && i + 1 < tokens.Count && !OnlyCommentTokensFrom(tokens, i + 1))
                        {
                            throw new LispException(BracketsOutOfBalanceOrUnexpectedScriptCode, token, moduleName);
                        }
                        parseResult = current;
                        return(i);
                    }
                }
                else if (token.Type == LispTokenType.Quote || token.Type == LispTokenType.QuasiQuote)
                {
                    var quote = new List <object>();
                    quote.Add(new LispVariant(LispType.Symbol, token.Type == LispTokenType.Quote ? LispEnvironment.Quote : LispEnvironment.Quasiquote));

                    object quotedList = null;
                    i = ParseTokens(moduleName, tokens, i + 1, ref quotedList, isToplevel: false);
                    quote.Add(quotedList);

                    if (current != null)
                    {
                        current.Add(quote);
                    }
                }
                else if (token.Type == LispTokenType.UnQuote || token.Type == LispTokenType.UnQuoteSplicing)
                {
                    var unquote = new List <object>();
                    LispUnQuoteModus unquotedModus = token.Type == LispTokenType.UnQuote ? LispUnQuoteModus.UnQuote : LispUnQuoteModus.UnQuoteSplicing;
                    unquote.Add(new LispVariant(LispType.Symbol, token.Type == LispTokenType.UnQuote ? LispEnvironment.UnQuote : LispEnvironment.UnQuoteSplicing));

                    object quotedList = null;
                    i = ParseTokens(moduleName, tokens, i + 1, ref quotedList, isToplevel: false);
                    unquote.Add(quotedList);

                    if (current != null)
                    {
                        current.Add(unquote);
                    }
                    else
                    {
                        parseResult = unquote;
                        return(i);
                    }
                }
                else if (token.Type == LispTokenType.Comment)
                {
                    // just ignore comment
                }
                else
                {
                    if (!isToplevel && current == null)
                    {
                        parseResult = new LispVariant(token);
                        return(i);
                    }
                    if (current == null)
                    {
                        throw new LispException(UnexpectedToken, token, moduleName);
                    }
                    current.Add(new LispVariant(token));
                }
            }

            if (isToplevel && tokens.Count > 0)
            {
                LispToken token = tokens.Last();
                throw new LispException(BracketsOutOfBalance, token, moduleName);
            }

            parseResult = current;
            return(i);
        }