1b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/* 2b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Copyright 2016 Google Inc. 3b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * 4b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Use of this source code is governed by a BSD-style license that can be 5b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * found in the LICENSE file. 6b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 711d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas 8b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#ifndef SKSL_PARSER 9b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#define SKSL_PARSER 10b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 11b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include <vector> 12b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include <memory> 133614d9adb328ccf3fc37f8e530f5f530330e37b4Ethan Nicholas#include <unordered_map> 14b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include <unordered_set> 15b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLErrorReporter.h" 16762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas#include "ir/SkSLLayout.h" 17b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLToken.h" 18b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 19b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct yy_buffer_state; 20b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#define YY_TYPEDEF_YY_BUFFER_STATE 21b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholastypedef struct yy_buffer_state *YY_BUFFER_STATE; 22b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 23b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasnamespace SkSL { 24b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 25b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTBlock; 26b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTBreakStatement; 27b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTContinueStatement; 28b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTDeclaration; 29b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTDiscardStatement; 30b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTDoStatement; 31b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTExpression; 32b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTExpressionStatement; 33b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTForStatement; 34b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTIfStatement; 35b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTInterfaceBlock; 36b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTParameter; 375961bc9278a00e56dacdd9408d0744b5a0a3b493ethannicholasstruct ASTPrecision; 38b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTReturnStatement; 39b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTStatement; 40b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTSuffix; 41af19769831f1c4c3b90c85aa9f8851cd8bbf86d5Ethan Nicholasstruct ASTSwitchCase; 42af19769831f1c4c3b90c85aa9f8851cd8bbf86d5Ethan Nicholasstruct ASTSwitchStatement; 43b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTType; 44b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTWhileStatement; 4514fe8cc16d2a98d5a96f818e4d0b7127ecad59e2ethannicholasstruct ASTVarDeclarations; 4611d53974317fa29cc516075382e658ddd45fc151Ethan Nicholasstruct Modifiers; 47b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasclass SymbolTable; 48b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 49b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/** 50b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Consumes .sksl text and produces an abstract syntax tree describing the contents. 51b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 52b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasclass Parser { 53b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholaspublic: 540df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas Parser(String text, SymbolTable& types, ErrorReporter& errors); 55b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 56b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas ~Parser(); 57b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 58b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 59b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Consumes a complete .sksl file and produces a list of declarations. Errors are reported via 60b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * the ErrorReporter; the return value may contain some declarations even when errors have 61b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * occurred. 62b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 63b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::vector<std::unique_ptr<ASTDeclaration>> file(); 64b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 65b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasprivate: 66b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 67762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * Return the next token, including whitespace tokens, from the parse stream. 68762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas */ 69762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas Token nextRawToken(); 70762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas 71762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas /** 72762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * Return the next non-whitespace token from the parse stream. 73b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 74b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas Token nextToken(); 75b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 76b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 77b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Push a token back onto the parse stream, so that it is the next one read. Only a single level 78b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * of pushback is supported (that is, it is an error to call pushback() twice in a row without 79b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * an intervening nextToken()). 80b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 81b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas void pushback(Token t); 82b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 83b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 84762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * Returns the next non-whitespace token without consuming it from the stream. 85b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 86b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas Token peek(); 87b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 88b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 890c9d13b97a1990ee5fea2608150d3d2c1f6b8948Ethan Nicholas * Checks to see if the next token is of the specified type. If so, stores it in result (if 900c9d13b97a1990ee5fea2608150d3d2c1f6b8948Ethan Nicholas * result is non-null) and returns true. Otherwise, pushes it back and returns false. 910c9d13b97a1990ee5fea2608150d3d2c1f6b8948Ethan Nicholas */ 920c9d13b97a1990ee5fea2608150d3d2c1f6b8948Ethan Nicholas bool checkNext(Token::Kind kind, Token* result = nullptr); 930c9d13b97a1990ee5fea2608150d3d2c1f6b8948Ethan Nicholas 940c9d13b97a1990ee5fea2608150d3d2c1f6b8948Ethan Nicholas /** 95762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * Reads the next non-whitespace token and generates an error if it is not the expected type. 96762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * The 'expected' string is part of the error message, which reads: 97b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * 98b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * "expected <expected>, but found '<actual text>'" 99b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * 100b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * If 'result' is non-null, it is set to point to the token that was read. 101b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Returns true if the read token was as expected, false otherwise. 102b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 1039e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas bool expect(Token::Kind kind, const char* expected, Token* result = nullptr); 1040df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas bool expect(Token::Kind kind, String expected, Token* result = nullptr); 105b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 1069e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas void error(Position p, const char* msg); 1070df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas void error(Position p, String msg); 1080df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas 109b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 110b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Returns true if the 'name' identifier refers to a type name. For instance, isType("int") will 111b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * always return true. 112b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 1130df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas bool isType(String name); 114b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 115b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas // these functions parse individual grammar rules from the current parse position; you probably 116b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas // don't need to call any of these outside of the parser. The function declarations in the .cpp 117b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas // file have comments describing the grammar rules. 118b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 1195961bc9278a00e56dacdd9408d0744b5a0a3b493ethannicholas std::unique_ptr<ASTDeclaration> precision(); 120b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 121b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDeclaration> directive(); 122b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 123762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas std::unique_ptr<ASTDeclaration> section(); 124762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas 125b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDeclaration> declaration(); 126b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 12714fe8cc16d2a98d5a96f818e4d0b7127ecad59e2ethannicholas std::unique_ptr<ASTVarDeclarations> varDeclarations(); 128b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 129b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTType> structDeclaration(); 130b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 13111d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas std::unique_ptr<ASTVarDeclarations> structVarDeclaration(Modifiers modifiers); 132b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 13311d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas std::unique_ptr<ASTVarDeclarations> varDeclarationEnd(Modifiers modifiers, 13411d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas std::unique_ptr<ASTType> type, 1350df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas String name); 136b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 137b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTParameter> parameter(); 138b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 139b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas int layoutInt(); 1400df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas 141762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas String layoutCode(); 142762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas 143762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas Layout::Key layoutKey(); 144762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas 14511d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas Layout layout(); 146b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 14711d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas Modifiers modifiers(); 148b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 14911d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas Modifiers modifiersWithDefaults(int defaultFlags); 150b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 151b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTStatement> statement(); 152b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 153b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTType> type(); 154b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 15511d53974317fa29cc516075382e658ddd45fc151Ethan Nicholas std::unique_ptr<ASTDeclaration> interfaceBlock(Modifiers mods); 156b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 157b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTIfStatement> ifStatement(); 158b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 159b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDoStatement> doStatement(); 160b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 161b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTWhileStatement> whileStatement(); 162b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 163b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTForStatement> forStatement(); 164b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 165af19769831f1c4c3b90c85aa9f8851cd8bbf86d5Ethan Nicholas std::unique_ptr<ASTSwitchCase> switchCase(); 166af19769831f1c4c3b90c85aa9f8851cd8bbf86d5Ethan Nicholas 167af19769831f1c4c3b90c85aa9f8851cd8bbf86d5Ethan Nicholas std::unique_ptr<ASTStatement> switchStatement(); 168af19769831f1c4c3b90c85aa9f8851cd8bbf86d5Ethan Nicholas 169b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTReturnStatement> returnStatement(); 170b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 171b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTBreakStatement> breakStatement(); 172b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 173b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTContinueStatement> continueStatement(); 174b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 175b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDiscardStatement> discardStatement(); 176b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 177b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTBlock> block(); 178b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 179b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpressionStatement> expressionStatement(); 180b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 181b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> expression(); 182b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 1834b330dfd3334bf24bf93043acfcd31590a3cdbbfEthan Nicholas std::unique_ptr<ASTExpression> commaExpression(); 1844b330dfd3334bf24bf93043acfcd31590a3cdbbfEthan Nicholas 185b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> assignmentExpression(); 1860df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas 187b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> ternaryExpression(); 188b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 189b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> logicalOrExpression(); 190b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 191b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> logicalXorExpression(); 192b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 193b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> logicalAndExpression(); 194b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 195b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> bitwiseOrExpression(); 196b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 197b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> bitwiseXorExpression(); 198b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 199b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> bitwiseAndExpression(); 200b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 201b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> equalityExpression(); 202b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 203b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> relationalExpression(); 204b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 205b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> shiftExpression(); 206b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 207b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> additiveExpression(); 208b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 209b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> multiplicativeExpression(); 210b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 211b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> unaryExpression(); 212b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 213b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> postfixExpression(); 214b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 215b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTSuffix> suffix(); 216b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 217b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> term(); 218b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 219b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas bool intLiteral(int64_t* dest); 220b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 221b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas bool floatLiteral(double* dest); 222b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 223b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas bool boolLiteral(bool* dest); 224b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 2250df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas bool identifier(String* dest); 226b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 227b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas void* fScanner; 228bfe15f61a277a50b05703307f56e184cc00b1aa7Ethan Nicholas void* fLayoutScanner; 229b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas YY_BUFFER_STATE fBuffer; 230cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas // current parse depth, used to enforce a recursion limit to try to keep us from overflowing the 231cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas // stack on pathological inputs 232cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas int fDepth = 0; 233b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas Token fPushback; 234b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas SymbolTable& fTypes; 235b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas ErrorReporter& fErrors; 236cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas 237cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas friend class AutoDepth; 238b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas}; 239b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 240b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas} // namespace 241b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 242b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#endif 243