blob: 29fa81e2e06ade7b9f8bddcef5567fafafb4ac69 [file] [log] [blame]
ethannicholasb3058bd2016-07-01 08:22:01 -07001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SKSL_TOKEN
9#define SKSL_TOKEN
10
11#include "SkSLPosition.h"
12#include "SkSLUtil.h"
13
14namespace SkSL {
15
ethannicholasf789b382016-08-03 12:43:36 -070016#undef IN
17#undef OUT
18#undef CONST
19
ethannicholasb3058bd2016-07-01 08:22:01 -070020/**
21 * Represents a lexical analysis token. Token is generally only used during the parse process, but
22 * Token::Kind is also used to represent operator kinds.
23 */
24struct Token {
25 enum Kind {
26 END_OF_FILE,
27 IDENTIFIER,
28 INT_LITERAL,
29 FLOAT_LITERAL,
30 TRUE_LITERAL,
31 FALSE_LITERAL,
32 LPAREN,
33 RPAREN,
34 LBRACE,
35 RBRACE,
36 LBRACKET,
37 RBRACKET,
38 DOT,
39 COMMA,
40 PLUSPLUS,
41 MINUSMINUS,
42 PLUS,
43 MINUS,
44 STAR,
45 SLASH,
46 PERCENT,
47 SHL,
48 SHR,
49 BITWISEOR,
50 BITWISEXOR,
51 BITWISEAND,
52 LOGICALOR,
53 LOGICALXOR,
54 LOGICALAND,
55 NOT,
56 QUESTION,
57 COLON,
58 EQ,
59 EQEQ,
60 NEQ,
61 GT,
62 LT,
63 GTEQ,
64 LTEQ,
65 PLUSEQ,
66 MINUSEQ,
67 STAREQ,
68 SLASHEQ,
69 PERCENTEQ,
70 SHLEQ,
71 SHREQ,
72 BITWISEOREQ,
73 BITWISEXOREQ,
74 BITWISEANDEQ,
75 LOGICALOREQ,
76 LOGICALXOREQ,
77 LOGICALANDEQ,
78 SEMICOLON,
79 IF,
80 ELSE,
81 FOR,
82 WHILE,
83 DO,
84 RETURN,
85 BREAK,
86 CONTINUE,
87 DISCARD,
88 IN,
89 OUT,
90 INOUT,
91 CONST,
92 LOWP,
93 MEDIUMP,
94 HIGHP,
95 UNIFORM,
ethannicholasf789b382016-08-03 12:43:36 -070096 FLAT,
97 NOPERSPECTIVE,
ethannicholasb3058bd2016-07-01 08:22:01 -070098 STRUCT,
99 LAYOUT,
100 DIRECTIVE,
101 PRECISION,
102 INVALID_TOKEN
103 };
104
105 static std::string OperatorName(Kind kind) {
106 switch (kind) {
107 case Token::PLUS: return "+";
108 case Token::MINUS: return "-";
109 case Token::STAR: return "*";
110 case Token::SLASH: return "/";
111 case Token::PERCENT: return "%";
112 case Token::SHL: return "<<";
113 case Token::SHR: return ">>";
114 case Token::LOGICALAND: return "&&";
115 case Token::LOGICALOR: return "||";
116 case Token::LOGICALXOR: return "^^";
117 case Token::BITWISEAND: return "&";
118 case Token::BITWISEOR: return "|";
119 case Token::BITWISEXOR: return "^";
120 case Token::EQ: return "=";
121 case Token::EQEQ: return "==";
122 case Token::NEQ: return "!=";
123 case Token::LT: return "<";
124 case Token::GT: return ">";
125 case Token::LTEQ: return "<=";
126 case Token::GTEQ: return ">=";
127 case Token::PLUSEQ: return "+=";
128 case Token::MINUSEQ: return "-=";
129 case Token::STAREQ: return "*=";
130 case Token::SLASHEQ: return "/=";
131 case Token::PERCENTEQ: return "%=";
132 case Token::SHLEQ: return "<<=";
133 case Token::SHREQ: return ">>=";
134 case Token::LOGICALANDEQ: return "&&=";
135 case Token::LOGICALOREQ: return "||=";
136 case Token::LOGICALXOREQ: return "^^=";
137 case Token::BITWISEANDEQ: return "&=";
138 case Token::BITWISEOREQ: return "|=";
139 case Token::BITWISEXOREQ: return "^=";
140 case Token::PLUSPLUS: return "++";
141 case Token::MINUSMINUS: return "--";
142 case Token::NOT: return "!";
143 default:
144 ABORT("unsupported operator: %d\n", kind);
145 }
146 }
147
148 Token() {
149 }
150
151 Token(Position position, Kind kind, std::string text)
152 : fPosition(position)
153 , fKind(kind)
154 , fText(std::move(text)) {}
155
156 Position fPosition;
157 Kind fKind;
158 std::string fText;
159};
160
161} // namespace
162#endif