Skip to content

Instantly share code, notes, and snippets.

@ThePhD

ThePhD/lexer.hpp Secret

Created May 17, 2015 15:18
Show Gist options
  • Save ThePhD/dc8b6277f279eeb5c289 to your computer and use it in GitHub Desktop.
Save ThePhD/dc8b6277f279eeb5c289 to your computer and use it in GitHub Desktop.
SO MUCH KEYWORDING
#pragma once
#include "token.hpp"
#include <map>
#include <unordered_map>
namespace gld { namespace hlsl {
class lexer {
private:
std::map<string, token_id> pragma;
std::unordered_map<string, token_id> preprocessor;
std::unordered_map<string, token_id> keywords;
public:
lexer() {
keywords.insert({
{ "auto", token_id::reserved_auto },
{ "catch", token_id::reserved_catch },
{ "char", token_id::reserved_char },
{ "class", token_id::reserved_class },
{ "const_cast", token_id::reserved_const_cast },
{ "default", token_id::reserved_default },
{ "delete", token_id::reserved_delete },
{ "dynamic_cast", token_id::reserved_dynamic_cast },
{ "enum", token_id::reserved_enum },
{ "explicit", token_id::reserved_explicit },
{ "friend", token_id::reserved_friend },
{ "goto", token_id::reserved_goto },
{ "long", token_id::reserved_long },
{ "mutable", token_id::reserved_mutable },
{ "namespace", token_id::reserved_namespace },
{ "new", token_id::reserved_new },
{ "operator", token_id::reserved_operator },
{ "private", token_id::reserved_private },
{ "public", token_id::reserved_public },
{ "protected", token_id::reserved_protected },
{ "reinterpret_case", token_id::reserved_reinterpret_cast },
{ "short", token_id::reserved_short },
{ "signed", token_id::reserved_signed },
{ "sizeof", token_id::reserved_sizeof },
{ "static_cast", token_id::reserved_static_cast },
{ "template", token_id::reserved_template },
{ "typename", token_id::reserved_typename },
{ "this", token_id::reserved_this },
{ "try", token_id::reserved_try },
{ "union", token_id::reserved_union },
{ "unsigned", token_id::reserved_unsigned },
{ "virtual", token_id::reserved_virtual },
{ "if", token_id::flow_control_if },
{ "else", token_id::flow_control_else },
{ "for", token_id::flow_control_for },
{ "do", token_id::flow_control_do },
{ "while", token_id::flow_control_while },
{ "case", token_id::flow_control_case },
{ "break", token_id::flow_control_break },
{ "continue", token_id::flow_control_continue },
{ "return", token_id::flow_control_return },
{ "unroll", token_id::unroll_attribute },
{ "loop", token_id::loop_attribute },
{ "fastop", token_id::fastop_attribute },
{ "allow_uav_condition", token_id::allow_uav_condition_attribute },
{ "flatten", token_id::flatten_attribute },
{ "branch", token_id::branch_attribute },
{ "forcecase", token_id::forcecase_attribute },
{ "call", token_id::call_attribute },
{ "typedef", token_id::keyword_typedef },
{ "struct", token_id::keyword_struct },
{ "interface", token_id::keyword_interface },
{ "cbuffer", token_id::keyword_cbuffer },
{ "tbuffer", token_id::keyword_tbuffer },
{ "register", token_id::keyword_register },
{ "discard", token_id::keyword_discard },
{ "inline", token_id::keyword_inline },
{ "static", token_id::keyword_static },
{ "extern", token_id::keyword_extern },
{ "volatile", token_id::keyword_volatile },
{ "in", token_id::in },
{ "inout", token_id::inout },
{ "out", token_id::out },
{ "uniform", token_id::uniform },
{ "unorm", token_id::unorm },
{ "snorm", token_id::snorm },
{ "const", token_id::keyword_const },
{ "packoffset", token_id::keyword_packoffset },
{ "row_major", token_id::keyword_row_major },
{ "column_major", token_id::keyword_column_major },
{ "linear", token_id::linear },
{ "noperspective", token_id::noperspective },
{ "nointerpolation", token_id::nointerpolation },
{ "sample", token_id::sample },
{ "precise", token_id::precise },
{ "shared", token_id::shared },
{ "linear", token_id::linear },
{ "noperspective", token_id::noperspective },
{ "nointerpolation", token_id::nointerpolation },
{ "sample", token_id::sample },
{ "precise", token_id::precise },
{ "shared", token_id::shared },
{ "groupshared", token_id::groupshared },
{ "clipplanes", token_id::clipplanes },
{ "maxvertexcount", token_id::maxvertexcount },
{ "pass", token_id::keyword_pass },
{ "technique", token_id::keyword_technique },
{ "technique10", token_id::keyword_technique_sm4 },
{ "technique11", token_id::keyword_technique_sm5 },
{ "compile", token_id::keyword_compile },
{ "VertexShader", token_id::keyword_vertex_shader },
{ "HullShader", token_id::keyword_hull_shader },
{ "DomainShader", token_id::keyword_domain_shader },
{ "GeometryShader", token_id::keyword_geometry_shader },
{ "PixelShader", token_id::keyword_pixel_shader },
{ "ComputeShader", token_id::keyword_compute_shader },
{ "Compile", token_id::keyword_compile_sm4 },
{ "SetVertexShader", token_id::keyword_vertex_shader_sm4 },
{ "SetHullShader", token_id::keyword_hull_shader_sm4 },
{ "SetDomainShader", token_id::keyword_domain_shader_sm4 },
{ "SetGeometryShader", token_id::keyword_geometry_shader_sm4 },
{ "SetPixelShader", token_id::keyword_pixel_shader_sm4 },
{ "SetComputeShader", token_id::keyword_compute_shader_sm4 },
{ "vs_2_0", token_id::profile_vs_20 },
{ "vs_2_a", token_id::profile_vs_2a },
{ "vs_2_b", token_id::profile_vs_2b },
{ "vs_2_s_w", token_id::profile_vs_2sw },
{ "vs_4_0_level_9_0", token_id::profile_vs_40_level_90 },
{ "vs_4_0_level_9_1", token_id::profile_vs_40_level_91 },
{ "vs_4_0_level_9_3", token_id::profile_vs_40_level_93 },
{ "vs_3_0", token_id::profile_vs_30 },
{ "vs_4_0", token_id::profile_vs_40 },
{ "vs_4_1", token_id::profile_vs_41 },
{ "vs_5_0", token_id::profile_vs_50 },
{ "vs_5_1", token_id::profile_vs_51 },
{ "gs_4_0", token_id::profile_gs_40 },
{ "gs_4_1", token_id::profile_gs_41 },
{ "gs_5_0", token_id::profile_gs_50 },
{ "gs_5_1", token_id::profile_gs_51 },
{ "hs_5_0", token_id::profile_hs_50 },
{ "hs_5_1", token_id::profile_hs_51 },
{ "ds_5_0", token_id::profile_ds_50 },
{ "ds_5_1", token_id::profile_ds_51 },
{ "ps_2_0", token_id::profile_ps_20 },
{ "ps_2_a", token_id::profile_ps_2a },
{ "ps_2_b", token_id::profile_ps_2b },
{ "ps_2_s_w", token_id::profile_ps_2sw },
{ "ps_4_0_level_9_0", token_id::profile_ps_40_level_90 },
{ "ps_4_0_level_9_1", token_id::profile_ps_40_level_91 },
{ "ps_4_0_level_9_3", token_id::profile_ps_40_level_93 },
{ "ps_3_0", token_id::profile_ps_30 },
{ "ps_4_0", token_id::profile_ps_40 },
{ "ps_4_1", token_id::profile_ps_41 },
{ "ps_5_0", token_id::profile_ps_50 },
{ "ps_5_1", token_id::profile_ps_51 },
{ "cs_4_0", token_id::profile_cs_40 },
{ "cs_4_1", token_id::profile_cs_41 },
{ "cs_5_0", token_id::profile_cs_50 },
{ "cs_5_1", token_id::profile_cs_51 },
{ "lib_4_0_level_9_0", token_id::profile_lib_40_level_90 },
{ "lib_4_0_level_9_1", token_id::profile_lib_40_level_91 },
{ "lib_4_0_level_9_3", token_id::profile_lib_40_level_93 },
{ "lib_4_0", token_id::profile_lib_40 },
{ "lib_4_1", token_id::profile_lib_41 },
{ "lib_5_0", token_id::profile_lib_50 },
{ "lib_5_1", token_id::profile_lib_51 },
{ "texture", token_id::type_texture },
{ "Texture1D", token_id::type_texture_1d },
{ "Texture1DArray", token_id::type_texture_1d_array },
{ "texture", token_id::type_texture_2d },
{ "Texture2D", token_id::type_texture_2d },
{ "Texture2DArray", token_id::type_texture_2d_array },
{ "Texture3D", token_id::type_texture_3d },
{ "TextureCube", token_id::type_texture_cube },
{ "sampler", token_id::keyword_sampler },
{ "sampler1D", token_id::type_sampler_1d },
{ "sampler2D", token_id::type_sampler_2d },
{ "sampler3D", token_id::type_sampler_3d },
{ "samplerCUBE", token_id::type_sampler_cube },
{ "sampler_state", token_id::type_sampler_state },
{ "SamplerState", token_id::type_sampler_state_sm4 },
{ "SamplerComparisonState", token_id::type_sampler_comparison_state },
{ "ComparisonFunc", token_id::type_sampler_comparison_state_comparison_func },
{ "/*", token_id::block_comment_begin }, // TODO: Move to basic per-character processor?
{ "*/", token_id::block_comment_end },
{ "//", token_id::line_comment },
});
preprocessor.insert({
{ "define", token_id::preprocessor_define },
{ "undef", token_id::preprocessor_undef },
{ "if", token_id::preprocessor_if },
{ "elif", token_id::preprocessor_elif },
{ "ifdef", token_id::preprocessor_ifdef },
{ "ifndef", token_id::preprocessor_ifndef },
{ "elif", token_id::preprocessor_else },
{ "endif", token_id::preprocessor_endif },
{ "include", token_id::preprocessor_include },
{ "line", token_id::preprocessor_line },
{ "pragma", token_id::preprocessor_pragma },
{ "error", token_id::preprocessor_error },
});
pragma.insert({
{ "def", token_id::preprocessor_pragma_register_define },
{ "pack_matrix", token_id::preprocessor_pragma_pack_matrix },
{ "warning", token_id::preprocessor_pragma_warning },
{ "message", token_id::preprocessor_pragma_message },
});
}
};
}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment