ds@125: /* vim: set ts=4 sw=4 tw=99 et: ds@125: * dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@116: * This file is part of SourcePawn. dvander@0: * dvander@116: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@116: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@116: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #ifndef _include_jitcraft_parser_h_ dvander@0: #define _include_jitcraft_parser_h_ dvander@0: dvander@0: #include dvander@195: #include "../Strings.h" dvander@0: #include "AST.h" dvander@0: #include "Scanner.h" dvander@0: #include "Scopes.h" dvander@0: dvander@59: namespace ke { dvander@0: dvander@0: class Parser dvander@0: { dvander@54: Zone *zone_; dvander@25: CompileContext &cc_; dvander@0: PoolAllocator &pool_; dvander@0: Scanner scanner_; dvander@57: PoolList *unbound_; dvander@195: PoolList *imports_; dvander@71: bool encounteredReturn_; dvander@0: dvander@0: private: dvander@145: bool peek(TokenKind kind); dvander@0: bool match(TokenKind kind); dvander@0: bool expect(TokenKind kind); dvander@63: bool matchSemicolon(); dvander@0: dvander@195: enum DeclKind { dvander@195: DeclArg, dvander@195: DeclFun, dvander@195: DeclField dvander@195: }; dvander@145: dvander@195: VariableDeclaration *var(TypeQualifiers qual); dvander@195: Statement *vars(TypeQualifiers qual); dvander@54: bool matchName(String **name, TokenKind kind = TOK_NAME); dvander@195: bool typeAndName(Expression **type, String **namep); dvander@195: bool fullTypeAndName(Expression **type, String **namep, DeclKind kind); dvander@145: dvander@145: ExpressionList *dimensions(); dvander@54: String *expectName(); dvander@145: dvander@0: Expression *primitive(); dvander@212: Expression *fixedArrayLiteral(); dvander@0: Expression *call(Expression *callee); dvander@148: Expression *field(Expression *left); dvander@0: Expression *index(Expression *left); dvander@0: Expression *prefix(); dvander@0: Expression *primary(); dvander@0: Expression *unary(); dvander@0: Expression *multiplication(); dvander@8: Expression *addition(); dvander@2: Expression *shift(); dvander@28: Expression *bitand_(); dvander@8: Expression *bitxor(); dvander@28: Expression *bitor_(); dvander@0: Expression *relational(); dvander@0: Expression *equals(); dvander@75: Expression *and_(); dvander@75: Expression *or_(); dvander@83: Expression *ternary(); dvander@22: Expression *assignment(); dvander@0: Expression *expression(); dvander@0: dvander@172: Statement *switch_(); dvander@146: Statement *struct_(); dvander@2: Statement *enum_(); dvander@0: Statement *if_(); dvander@195: Statement *block(); dvander@63: Statement *function(TokenKind tok); dvander@0: Statement *expressionStatement(); dvander@9: Statement *while_(); dvander@9: Statement *do_(); dvander@0: Statement *forStatement(); dvander@0: Statement *localStatement(); dvander@0: Statement *globalStatement(); dvander@0: Statement *returnStatement(); dvander@258: ImportStatement *import(TokenKind kind); dvander@0: dvander@0: public: dvander@54: Parser(Zone *zone, CompileContext &cc, const char *stream, size_t length); dvander@0: dvander@0: ParseTree *parse(); dvander@0: }; dvander@0: dvander@0: } dvander@0: dvander@0: #endif // _include_jitcraft_parser_h_