| |
| /* Compiler implementation of the D programming language |
| * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved |
| * written by Walter Bright |
| * http://www.digitalmars.com |
| * Distributed under the Boost Software License, Version 1.0. |
| * http://www.boost.org/LICENSE_1_0.txt |
| * https://github.com/D-Programming-Language/dmd/blob/master/src/parse.h |
| */ |
| |
| #pragma once |
| |
| #include "arraytypes.h" |
| #include "lexer.h" |
| #include "enum.h" |
| |
| class Type; |
| class TypeQualified; |
| class Expression; |
| class Declaration; |
| class Statement; |
| class Import; |
| class Initializer; |
| class FuncDeclaration; |
| class CtorDeclaration; |
| class PostBlitDeclaration; |
| class DtorDeclaration; |
| class StaticCtorDeclaration; |
| class StaticDtorDeclaration; |
| class SharedStaticCtorDeclaration; |
| class SharedStaticDtorDeclaration; |
| class ConditionalDeclaration; |
| class InvariantDeclaration; |
| class UnitTestDeclaration; |
| class NewDeclaration; |
| class DeleteDeclaration; |
| class Condition; |
| class Module; |
| struct ModuleDeclaration; |
| class TemplateDeclaration; |
| class TemplateInstance; |
| class StaticAssert; |
| struct PrefixAttributes; |
| |
| /************************************ |
| * These control how parseStatement() works. |
| */ |
| |
| enum ParseStatementFlags |
| { |
| PSsemi = 1, // empty ';' statements are allowed, but deprecated |
| PSscope = 2, // start a new scope |
| PScurly = 4, // { } statement is required |
| PScurlyscope = 8, // { } starts a new scope |
| PSsemi_ok = 0x10 // empty ';' are really ok |
| }; |
| |
| |
| class Parser : public Lexer |
| { |
| public: |
| Module *mod; |
| ModuleDeclaration *md; |
| LINK linkage; |
| CPPMANGLE cppmangle; |
| Loc endloc; // set to location of last right curly |
| int inBrackets; // inside [] of array index or slice |
| Loc lookingForElse; // location of lonely if looking for an else |
| |
| Parser(Loc loc, Module *module, const utf8_t *base, size_t length, bool doDocComment); |
| Parser(Module *module, const utf8_t *base, size_t length, bool doDocComment); |
| |
| Dsymbols *parseModule(); |
| Dsymbols *parseDeclDefs(int once, Dsymbol **pLastDecl = NULL, PrefixAttributes *pAttrs = NULL); |
| Dsymbols *parseAutoDeclarations(StorageClass storageClass, const utf8_t *comment); |
| Dsymbols *parseBlock(Dsymbol **pLastDecl, PrefixAttributes *pAttrs = NULL); |
| StorageClass appendStorageClass(StorageClass storageClass, StorageClass stc, bool deprec = false); |
| StorageClass parseAttribute(Expressions **pexps); |
| StorageClass parsePostfix(StorageClass storageClass, Expressions **pudas); |
| StorageClass parseTypeCtor(); |
| Expression *parseConstraint(); |
| TemplateDeclaration *parseTemplateDeclaration(bool ismixin = false); |
| TemplateParameters *parseTemplateParameterList(int flag = 0); |
| Dsymbol *parseMixin(); |
| Objects *parseTemplateArguments(); |
| Objects *parseTemplateArgumentList(); |
| Objects *parseTemplateSingleArgument(); |
| StaticAssert *parseStaticAssert(); |
| TypeQualified *parseTypeof(); |
| Type *parseVector(); |
| LINK parseLinkage(Identifiers **, CPPMANGLE *, bool *); |
| Identifiers *parseQualifiedIdentifier(const char *entity); |
| Condition *parseDebugCondition(); |
| Condition *parseVersionCondition(); |
| Condition *parseStaticIfCondition(); |
| Dsymbol *parseCtor(PrefixAttributes *pAttrs); |
| Dsymbol *parseDtor(PrefixAttributes *pAttrs); |
| Dsymbol *parseStaticCtor(PrefixAttributes *pAttrs); |
| Dsymbol *parseStaticDtor(PrefixAttributes *pAttrs); |
| Dsymbol *parseSharedStaticCtor(PrefixAttributes *pAttrs); |
| Dsymbol *parseSharedStaticDtor(PrefixAttributes *pAttrs); |
| Dsymbol *parseInvariant(PrefixAttributes *pAttrs); |
| Dsymbol *parseUnitTest(PrefixAttributes *pAttrs); |
| Dsymbol *parseNew(PrefixAttributes *pAttrs); |
| Dsymbol *parseDelete(PrefixAttributes *pAttrs); |
| Parameters *parseParameters(int *pvarargs, TemplateParameters **tpl = NULL); |
| EnumDeclaration *parseEnum(); |
| Dsymbol *parseAggregate(); |
| BaseClasses *parseBaseClasses(); |
| Dsymbols *parseImport(); |
| Type *parseType(Identifier **pident = NULL, TemplateParameters **ptpl = NULL); |
| Type *parseBasicType(bool dontLookDotIdents = false); |
| Type *parseBasicTypeStartingAt(TypeQualified *tid, bool dontLookDotIdents); |
| Type *parseBasicType2(Type *t); |
| Type *parseDeclarator(Type *t, int *alt, Identifier **pident, |
| TemplateParameters **tpl = NULL, StorageClass storage_class = 0, int *pdisable = NULL, Expressions **pudas = NULL); |
| void parseStorageClasses(StorageClass &storage_class, LINK &link, bool &setAlignment, Expression *&ealign, Expressions *&udas); |
| Dsymbols *parseDeclarations(bool autodecl, PrefixAttributes *pAttrs, const utf8_t *comment); |
| Dsymbol *parseFunctionLiteral(); |
| FuncDeclaration *parseContracts(FuncDeclaration *f); |
| void checkDanglingElse(Loc elseloc); |
| void checkCstyleTypeSyntax(Loc loc, Type *t, int alt, Identifier *ident); |
| /** endPtr used for documented unittests */ |
| Statement *parseStatement(int flags, const utf8_t** endPtr = NULL, Loc *pEndloc = NULL); |
| Initializer *parseInitializer(); |
| Expression *parseDefaultInitExp(); |
| void check(Loc loc, TOK value); |
| void check(TOK value); |
| void check(TOK value, const char *string); |
| void checkParens(TOK value, Expression *e); |
| bool isDeclaration(Token *t, int needId, TOK endtok, Token **pt); |
| bool isBasicType(Token **pt); |
| bool isDeclarator(Token **pt, int *haveId, int *haveTpl, TOK endtok, bool allowAltSyntax = true); |
| bool isParameters(Token **pt); |
| bool isExpression(Token **pt); |
| bool skipParens(Token *t, Token **pt); |
| bool skipParensIf(Token *t, Token **pt); |
| bool skipAttributes(Token *t, Token **pt); |
| |
| Expression *parseExpression(); |
| Expression *parsePrimaryExp(); |
| Expression *parseUnaryExp(); |
| Expression *parsePostExp(Expression *e); |
| Expression *parseMulExp(); |
| Expression *parseAddExp(); |
| Expression *parseShiftExp(); |
| Expression *parseCmpExp(); |
| Expression *parseAndExp(); |
| Expression *parseXorExp(); |
| Expression *parseOrExp(); |
| Expression *parseAndAndExp(); |
| Expression *parseOrOrExp(); |
| Expression *parseCondExp(); |
| Expression *parseAssignExp(); |
| |
| Expressions *parseArguments(); |
| |
| Expression *parseNewExp(Expression *thisexp); |
| |
| void addComment(Dsymbol *s, const utf8_t *blockComment); |
| }; |
| |
| // Operator precedence - greater values are higher precedence |
| |
| enum PREC |
| { |
| PREC_zero, |
| PREC_expr, |
| PREC_assign, |
| PREC_cond, |
| PREC_oror, |
| PREC_andand, |
| PREC_or, |
| PREC_xor, |
| PREC_and, |
| PREC_equal, |
| PREC_rel, |
| PREC_shift, |
| PREC_add, |
| PREC_mul, |
| PREC_pow, |
| PREC_unary, |
| PREC_primary |
| }; |
| |
| extern PREC precedence[TOKMAX]; |
| |
| void initPrecedence(); |