mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			254 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			254 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2014 Patrick Mours
 | |
|  * SPDX-License-Identifier: BSD-3-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <cstdint>
 | |
| #include <string>
 | |
| #include <vector>
 | |
| 
 | |
| namespace reshadefx
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Structure which keeps track of a code location.
 | |
| 	/// </summary>
 | |
| 	struct location
 | |
| 	{
 | |
| 		location() : line(1), column(1) {}
 | |
| 		explicit location(uint32_t line, uint32_t column = 1) : line(line), column(column) {}
 | |
| 		explicit location(std::string source, uint32_t line, uint32_t column = 1) : source(std::move(source)), line(line), column(column) {}
 | |
| 
 | |
| 		std::string source;
 | |
| 		uint32_t line, column;
 | |
| 	};
 | |
| 
 | |
| 	/// <summary>
 | |
| 	/// A collection of identifiers for various possible tokens.
 | |
| 	/// </summary>
 | |
| 	enum class tokenid
 | |
| 	{
 | |
| 		unknown = -1,
 | |
| 		end_of_file = 0,
 | |
| 		end_of_line = '\n',
 | |
| 
 | |
| 		// operators
 | |
| 		space = ' ',
 | |
| 		exclaim = '!',
 | |
| 		hash = '#',
 | |
| 		dollar = '$',
 | |
| 		percent = '%',
 | |
| 		ampersand = '&',
 | |
| 		parenthesis_open = '(',
 | |
| 		parenthesis_close = ')',
 | |
| 		star = '*',
 | |
| 		plus = '+',
 | |
| 		comma = ',',
 | |
| 		minus = '-',
 | |
| 		dot = '.',
 | |
| 		slash = '/',
 | |
| 		colon = ':',
 | |
| 		semicolon = ';',
 | |
| 		less = '<',
 | |
| 		equal = '=',
 | |
| 		greater = '>',
 | |
| 		question = '?',
 | |
| 		at = '@',
 | |
| 		bracket_open = '[',
 | |
| 		backslash = '\\',
 | |
| 		bracket_close = ']',
 | |
| 		caret = '^',
 | |
| 		brace_open = '{',
 | |
| 		pipe = '|',
 | |
| 		brace_close = '}',
 | |
| 		tilde = '~',
 | |
| 		exclaim_equal = 256 /* != */,
 | |
| 		percent_equal /* %= */,
 | |
| 		ampersand_ampersand /* && */,
 | |
| 		ampersand_equal /* &= */,
 | |
| 		star_equal /* *= */,
 | |
| 		plus_plus /* ++*/,
 | |
| 		plus_equal /* += */,
 | |
| 		minus_minus /* -- */,
 | |
| 		minus_equal /* -= */,
 | |
| 		arrow /* -> */,
 | |
| 		ellipsis /* ... */,
 | |
| 		slash_equal /* /= */,
 | |
| 		colon_colon /* :: */,
 | |
| 		less_less_equal /* <<= */,
 | |
| 		less_less /* << */,
 | |
| 		less_equal /* <= */,
 | |
| 		equal_equal /* == */,
 | |
| 		greater_greater_equal /* >>= */,
 | |
| 		greater_greater /* >> */,
 | |
| 		greater_equal /* >= */,
 | |
| 		caret_equal /* ^= */,
 | |
| 		pipe_equal /* |= */,
 | |
| 		pipe_pipe /* || */,
 | |
| 
 | |
| 		// identifiers
 | |
| 		reserved,
 | |
| 		identifier,
 | |
| 
 | |
| 		// literals
 | |
| 		true_literal,
 | |
| 		false_literal,
 | |
| 		int_literal,
 | |
| 		uint_literal,
 | |
| 		float_literal,
 | |
| 		double_literal,
 | |
| 		string_literal,
 | |
| 
 | |
| 		// keywords
 | |
| 		namespace_,
 | |
| 		struct_,
 | |
| 		technique,
 | |
| 		pass,
 | |
| 		for_,
 | |
| 		while_,
 | |
| 		do_,
 | |
| 		if_,
 | |
| 		else_,
 | |
| 		switch_,
 | |
| 		case_,
 | |
| 		default_,
 | |
| 		break_,
 | |
| 		continue_,
 | |
| 		return_,
 | |
| 		discard_,
 | |
| 		extern_,
 | |
| 		static_,
 | |
| 		uniform_,
 | |
| 		volatile_,
 | |
| 		precise,
 | |
| 		groupshared,
 | |
| 		in,
 | |
| 		out,
 | |
| 		inout,
 | |
| 		const_,
 | |
| 		linear,
 | |
| 		noperspective,
 | |
| 		centroid,
 | |
| 		nointerpolation,
 | |
| 
 | |
| 		void_,
 | |
| 		bool_,
 | |
| 		bool2,
 | |
| 		bool3,
 | |
| 		bool4,
 | |
| 		bool2x2,
 | |
| 		bool2x3,
 | |
| 		bool2x4,
 | |
| 		bool3x2,
 | |
| 		bool3x3,
 | |
| 		bool3x4,
 | |
| 		bool4x2,
 | |
| 		bool4x3,
 | |
| 		bool4x4,
 | |
| 		int_,
 | |
| 		int2,
 | |
| 		int3,
 | |
| 		int4,
 | |
| 		int2x2,
 | |
| 		int2x3,
 | |
| 		int2x4,
 | |
| 		int3x2,
 | |
| 		int3x3,
 | |
| 		int3x4,
 | |
| 		int4x2,
 | |
| 		int4x3,
 | |
| 		int4x4,
 | |
| 		min16int,
 | |
| 		min16int2,
 | |
| 		min16int3,
 | |
| 		min16int4,
 | |
| 		uint_,
 | |
| 		uint2,
 | |
| 		uint3,
 | |
| 		uint4,
 | |
| 		uint2x2,
 | |
| 		uint2x3,
 | |
| 		uint2x4,
 | |
| 		uint3x2,
 | |
| 		uint3x3,
 | |
| 		uint3x4,
 | |
| 		uint4x2,
 | |
| 		uint4x3,
 | |
| 		uint4x4,
 | |
| 		min16uint,
 | |
| 		min16uint2,
 | |
| 		min16uint3,
 | |
| 		min16uint4,
 | |
| 		float_,
 | |
| 		float2,
 | |
| 		float3,
 | |
| 		float4,
 | |
| 		float2x2,
 | |
| 		float2x3,
 | |
| 		float2x4,
 | |
| 		float3x2,
 | |
| 		float3x3,
 | |
| 		float3x4,
 | |
| 		float4x2,
 | |
| 		float4x3,
 | |
| 		float4x4,
 | |
| 		min16float,
 | |
| 		min16float2,
 | |
| 		min16float3,
 | |
| 		min16float4,
 | |
| 		vector,
 | |
| 		matrix,
 | |
| 		string_,
 | |
| 		texture1d,
 | |
| 		texture2d,
 | |
| 		texture3d,
 | |
| 		sampler1d,
 | |
| 		sampler2d,
 | |
| 		sampler3d,
 | |
| 		storage1d,
 | |
| 		storage2d,
 | |
| 		storage3d,
 | |
| 
 | |
| 		// preprocessor directives
 | |
| 		hash_def,
 | |
| 		hash_undef,
 | |
| 		hash_if,
 | |
| 		hash_ifdef,
 | |
| 		hash_ifndef,
 | |
| 		hash_else,
 | |
| 		hash_elif,
 | |
| 		hash_endif,
 | |
| 		hash_error,
 | |
| 		hash_warning,
 | |
| 		hash_pragma,
 | |
| 		hash_include,
 | |
| 		hash_unknown,
 | |
| 
 | |
| 		single_line_comment,
 | |
| 		multi_line_comment,
 | |
| 	};
 | |
| 
 | |
| 	/// <summary>
 | |
| 	/// A structure describing a single token in the input string.
 | |
| 	/// </summary>
 | |
| 	struct token
 | |
| 	{
 | |
| 		tokenid id;
 | |
| 		reshadefx::location location;
 | |
| 		size_t offset, length;
 | |
| 		union
 | |
| 		{
 | |
| 			int literal_as_int;
 | |
| 			unsigned int literal_as_uint;
 | |
| 			float literal_as_float;
 | |
| 			double literal_as_double;
 | |
| 		};
 | |
| 		std::string literal_as_string;
 | |
| 
 | |
| 		inline operator tokenid() const { return id; }
 | |
| 
 | |
| 		static std::string id_to_name(tokenid id);
 | |
| 	};
 | |
| }
 | 
