Ejemplo n.º 1
0
        public override void Accept(MatchExpression match)
        {
            bool hasCatchall     = false;
            bool hasTruePattern  = false;
            bool hasFalsePattern = false;

            foreach (AstNode node in match.MatchCases)
            {
                var matchCase = node as CaseExpression;


                if (matchCase != null)
                {
                    var nameExpr = matchCase.Pattern as NameExpression;

                    if (nameExpr != null && nameExpr.Value == "_")
                    {
                        hasCatchall = true;
                    }

                    var trueExpr = matchCase.Pattern as TrueExpression;

                    if (trueExpr != null)
                    {
                        hasTruePattern = true;
                    }

                    var falseExpr = matchCase.Pattern as FalseExpression;


                    if (falseExpr != null)
                    {
                        hasFalsePattern = true;
                    }
                }
            }

            bool isLegal = hasCatchall || (hasTruePattern && hasFalsePattern);

            if (!isLegal)
            {
                errorLog.Add(Errors.MatchDoesNotAccountForAllConditions,
                             match.Location);
            }

            base.Accept(match);
        }
Ejemplo n.º 2
0
        Token NextToken()
        {
            var ch = source.Peek();

            if (source.Peeks(2) == "0x")
            {
                return(ReadHexNumber());
            }

            if (char.IsDigit(ch))
            {
                return(ReadNumber());
            }

            if (char.IsLetter(ch) || ch == '_')
            {
                return(ReadIdentifier());
            }

            if (source.Peeks(3) == "/**")
            {
                ReadDocComment();
                return(null);
            }

            if (source.Peeks(2) == "/*")
            {
                ReadLineComment();
                return(null);
            }

            switch (ch)
            {
            case '\"':
            case '\'':
                return(ReadStringLiteral());

            case '#':
                source.SkipLine();
                return(null);
            }

            var punctuators = new Dictionary <char, TokenClass> {
                { '{', TokenClass.OpenBrace },
                { '}', TokenClass.CloseBrace },
                { '(', TokenClass.OpenParan },
                { ')', TokenClass.CloseParan },
                { '[', TokenClass.OpenBracket },
                { ']', TokenClass.CloseBracket },
                { ';', TokenClass.SemiColon },
                { ':', TokenClass.Colon },
                { ',', TokenClass.Comma }
            };

            if (punctuators.ContainsKey(source.Peek()))
            {
                var punctuator = source.Read();

                return(new Token(
                           punctuators [punctuator],
                           punctuator.ToString(),
                           lastDocStr,
                           source.Location
                           ));
            }

            if (OperatorChars.Contains(source.Peek()))
            {
                return(ReadOperator());
            }

            if (char.IsLetter(ch))
            {
                return(ReadIdentifier());
            }

            errorLog.Add(Errors.UnexpectedToken, source.Location, source.Read());

            return(null);
        }