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