/* Sun-$Revision: 23.4 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface struct Parser: ResourceObj { public: Parser(Scanner* scanner, bool silent); Expr* readExpr(fint& line, char*& sourceStart, fint& sourceLength); Object* readBody(fint& line, fint& col, char*& sourceStart, fint& sourceLength); // Syntax error reporting bool noParseError(); bool prematureEndOfInputError(); void fillErrorObj(oop errorObj); void syntaxError(char* msg, Token* t); void syntaxError(char* msg, int32 l = -1, int32 c = -1); private: bool silent; // Syntax errors void syntaxErrorExpecting(Token* t, char* expected); char *parse_error_message; int32 parse_error_line, parse_error_column; char *parse_error_expected; enum parseErrorKind { noParseErr, parseErr, prematureEndErr } error; Expr* implicitSelf; Scanner* scanner; Expr * parseExpr (Token* t, bool methodCandidate = false); Expr * parseBinary (Token* t, bool methodCandidate = false); Expr * parseUnary (Token* t, bool methodCandidate = false); Integer * parseInteger(Token* t); Float * parseFloat (Token* t); StringLiteral * parseString (Token* t); Expr * parseExpr (); Object* parseObject(char match, Token* t, fint nargs, bool methodCandidate = false, Token* anno = NULL); // nargs == 0: no argument slots allowed // < 0: indefinite number of arg slots // > 0: exactly nargs arg slots required bool parseBody(SlotList*& slots, ExprList*& code, Token* t, fint nargs, char*& sourceStart, fint& line, fint& col, Token*& object_annotation); Object* parseMethodDecl(Token* t, fint nargs, fint nargsSeen); // top level SlotList* parseObjectSlots(Token* t, Token*& object_annotation); // called recursively to accomodate neted annotations. SlotList* parseAnnotatedSlots(Token* t, SlotList* s, char* annos, Token*& object_annotation); SlotList* parseSlots(SlotList* s, char* annos, Token*& finalT, Token*& object_annotation); SlotList* parseSlot( SlotList* slots, Token* t, char* anno); SlotList* parseArgSlot( SlotList* slots, Token* t, char* anno); SlotList* parseUnarySlot( SlotList* slots, Token* t, char* anno); SlotList* parseBinarySlot( SlotList* slots, Token* t, char* anno); SlotList* parseKeywordSlot( SlotList* slots, Token* t, char* anno); void prematureEOF(Token* t); void expecting(Token* t, char* c); inline bool isupper(fint c) { return c >= 'A' && c <= 'Z'; } bool isValidSlotName(Token* name); bool isOp(Token* t); bool isPossibleOp(Token* t); String* OpStringFromNum(Token* t); String* StringFromOp(Token* t); bool testDone(); bool checkSubExpression(ExprList* body, Token* s); void innerMethodError(Token* t); };