示例#1
0
        AsmLine ParseWordDirective(Token head)
        {
            var result = new WordDirective();

            do
            {
                result.Elements.Add(ParseExpr());
            } while (TryMatchComma());
            MatchEndOfDirective();
            return(result);
        }
示例#2
0
        AsmLine TryParseDirective(Token head)
        {
            if (head.Type == TokenType.Symbol)
            {
                if (toks.PeekToken().Type == TokenType.Equals)
                {
                    toks.NextToken();
                    var expr = ParseExpr();
                    MaybeSkipTypeFlag();
                    MatchEndOfDirective();
                    return(new EqualsDirective(head.Text, expr));
                }

                if (directiveDict.TryGetValue(head.Text, out var handler))
                {
                    return(handler(head));
                }
            }

            if (CanStartExpr(head.Type))
            {
                switch (toks.PeekToken().Type)
                {
                case TokenType.EndOfFile:
                case TokenType.EndOfLine:
                case TokenType.Comma:
                case TokenType.Plus:
                    // data directive (.WORD keyword is optional)
                    break;

                default:
                    return(ParseUnrecognizedInstruction(head));
                }

                var result = new WordDirective();
                result.Elements.Add(ParseExpr(head));
                while (TryMatchComma())
                {
                    result.Elements.Add(ParseExpr());
                }
                MatchEndOfDirective();
                return(result);
            }

            return(null);
        }