AsmLine ParseWordDirective(Token head) { var result = new WordDirective(); do { result.Elements.Add(ParseExpr()); } while (TryMatchComma()); MatchEndOfDirective(); return(result); }
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); }