Handmade Hero»Episode Guide
Making a Parser for HHTs
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:03Welcome to the stream
🗩
0:03Welcome to the stream
🗩
0:03Welcome to the stream
🗩
0:33Announce a job opening on the game Sub Rosa1 by Alex Austin2
🗩
0:33Announce a job opening on the game Sub Rosa1 by Alex Austin2
🗩
0:33Announce a job opening on the game Sub Rosa1 by Alex Austin2
🗩
6:11Fix typos in base_game.hht3
🗹
6:11Fix typos in base_game.hht3
🗹
6:11Fix typos in base_game.hht3
🗹
8:44Note the need to search for asset files
🗩
8:44Note the need to search for asset files
🗩
8:44Note the need to search for asset files
🗩
11:44Consider allowing for placeholder stubs of nonexistent assets
🗩
11:44Consider allowing for placeholder stubs of nonexistent assets
🗩
11:44Consider allowing for placeholder stubs of nonexistent assets
🗩
15:37Set up to make our existing parsing code usable by multiple routines
🗩
15:37Set up to make our existing parsing code usable by multiple routines
🗩
15:37Set up to make our existing parsing code usable by multiple routines
🗩
19:10Get the simple_preprocessor building
19:10Get the simple_preprocessor building
19:10Get the simple_preprocessor building
24:30Save off handmade_generated.h as handmade_generated_original.h and diff them with Meld4
🗹
24:30Save off handmade_generated.h as handmade_generated_original.h and diff them with Meld4
🗹
24:30Save off handmade_generated.h as handmade_generated_original.h and diff them with Meld4
🗹
26:38Intentionally break the tokenizer and see the diff in Meld
🗹
26:38Intentionally break the tokenizer and see the diff in Meld
🗹
26:38Intentionally break the tokenizer and see the diff in Meld
🗹
27:59Pull out the tokenizing code from the simple_preprocessor into handmade_tokenizer.cpp and .h
27:59Pull out the tokenizing code from the simple_preprocessor into handmade_tokenizer.cpp and .h
27:59Pull out the tokenizing code from the simple_preprocessor into handmade_tokenizer.cpp and .h
30:17Convert the token struct to contain a length-string
30:17Convert the token struct to contain a length-string
30:17Convert the token struct to contain a length-string
36:11Organise the string manipulation code into handmade_shared.h
🗹
36:11Organise the string manipulation code into handmade_shared.h
🗹
36:11Organise the string manipulation code into handmade_shared.h
🗹
42:34Convert the whole tokenizer over to use length-strings, introducing Tokenizer()
42:34Convert the whole tokenizer over to use length-strings, introducing Tokenizer()
42:34Convert the whole tokenizer over to use length-strings, introducing Tokenizer()
47:38Update EatAllWhitespace() and GetToken() to use length-strings, noting that hand-coded token checking is the one thing made harder by length-strings vs null-terminated ones
47:38Update EatAllWhitespace() and GetToken() to use length-strings, noting that hand-coded token checking is the one thing made harder by length-strings vs null-terminated ones
47:38Update EatAllWhitespace() and GetToken() to use length-strings, noting that hand-coded token checking is the one thing made harder by length-strings vs null-terminated ones
56:09Introduce AdvanceChars() and Refill()
56:09Introduce AdvanceChars() and Refill()
56:09Introduce AdvanceChars() and Refill()
1:00:37Find that our generated files are identical
🗹
1:00:37Find that our generated files are identical
🗹
1:00:37Find that our generated files are identical
🗹
1:02:01Introduce ParseHHT() in a newly created handmade_hht.cpp, augmenting the tokenizer to handle all the single-character tokens in our .hht file format
1:02:01Introduce ParseHHT() in a newly created handmade_hht.cpp, augmenting the tokenizer to handle all the single-character tokens in our .hht file format
1:02:01Introduce ParseHHT() in a newly created handmade_hht.cpp, augmenting the tokenizer to handle all the single-character tokens in our .hht file format
1:16:20Make ParseTopLevelBlock() use RequireToken() and add systemic error handling in the tokenizer
1:16:20Make ParseTopLevelBlock() use RequireToken() and add systemic error handling in the tokenizer
1:16:20Make ParseTopLevelBlock() use RequireToken() and add systemic error handling in the tokenizer
1:26:37Verify that our generated files are identical
🗹
1:26:37Verify that our generated files are identical
🗹
1:26:37Verify that our generated files are identical
🗹
1:26:54Enable ParseTopLevelBlock() to parse all the fields of a block, introducing ParseTagList()
1:26:54Enable ParseTopLevelBlock() to parse all the fields of a block, introducing ParseTagList()
1:26:54Enable ParseTopLevelBlock() to parse all the fields of a block, introducing ParseTagList()
1:33:38Include handmade_hht.cpp everywhere necessary, and clean up compile errors
1:33:38Include handmade_hht.cpp everywhere necessary, and clean up compile errors
1:33:38Include handmade_hht.cpp everywhere necessary, and clean up compile errors
1:39:43Make hhaedit call ParseHHT() on intro_cutscene.hht, changing ReadEntireFile() to return a string
1:39:43Make hhaedit call ParseHHT() on intro_cutscene.hht, changing ReadEntireFile() to return a string
1:39:43Make hhaedit call ParseHHT() on intro_cutscene.hht, changing ReadEntireFile() to return a string
1:48:01Step through ParseHHT() to see what it does
🏃
1:48:01Step through ParseHHT() to see what it does
🏃
1:48:01Step through ParseHHT() to see what it does
🏃
1:49:13Add the "plate" keyword to ParseTopLevelBlock()
1:49:13Add the "plate" keyword to ParseTopLevelBlock()
1:49:13Add the "plate" keyword to ParseTopLevelBlock()
1:49:29Continue to step through ParseHHT()
🏃
1:49:29Continue to step through ParseHHT()
🏃
1:49:29Continue to step through ParseHHT()
🏃
1:50:08Encounter an apparent 4coder bug in which some contents of intro_cutscene.hht is missing
🗹
1:50:08Encounter an apparent 4coder bug in which some contents of intro_cutscene.hht is missing
🗹
1:50:08Encounter an apparent 4coder bug in which some contents of intro_cutscene.hht is missing
🗹
1:52:26Continue to step through ParseHHT() to completion
🏃
1:52:26Continue to step through ParseHHT() to completion
🏃
1:52:26Continue to step through ParseHHT() to completion
🏃
1:53:16Run the parser on base_game.hht and hit a (correctly handled) error
🏃
1:53:16Run the parser on base_game.hht and hit a (correctly handled) error
🏃
1:53:16Run the parser on base_game.hht and hit a (correctly handled) error
🏃
1:53:50Enable ParseTopLevelBlock() to handle the "default" block specially
1:53:50Enable ParseTopLevelBlock() to handle the "default" block specially
1:53:50Enable ParseTopLevelBlock() to handle the "default" block specially
1:54:58Run the parser to completion
🏃
1:54:58Run the parser to completion
🏃
1:54:58Run the parser to completion
🏃
1:55:12Q&A
🗩
1:55:12Q&A
🗩
1:55:12Q&A
🗩
1:55:46Miblo Q: Could the 4coder bug be at all related to your in-comment calculator?
🗪
1:55:46Miblo Q: Could the 4coder bug be at all related to your in-comment calculator?
🗪
1:55:46Miblo Q: Could the 4coder bug be at all related to your in-comment calculator?
🗪
1:55:56longboolean Q: Now that we are using this method to assign tags, does this change how you plan to organize lots of little items on a sheet that may have differing, non sheet-wide tags, and in cases where using significance of positioning in the sprite sheet is too limiting? For example, maybe a collection of different fauna, each plant may have different tags for attributes, but can not be easily put into categories
🗪
1:55:56longboolean Q: Now that we are using this method to assign tags, does this change how you plan to organize lots of little items on a sheet that may have differing, non sheet-wide tags, and in cases where using significance of positioning in the sprite sheet is too limiting? For example, maybe a collection of different fauna, each plant may have different tags for attributes, but can not be easily put into categories
🗪
1:55:56longboolean Q: Now that we are using this method to assign tags, does this change how you plan to organize lots of little items on a sheet that may have differing, non sheet-wide tags, and in cases where using significance of positioning in the sprite sheet is too limiting? For example, maybe a collection of different fauna, each plant may have different tags for attributes, but can not be easily put into categories
🗪
1:56:55jessef Q: What are some advanced parsing features that are interesting to you but may be too much work / not necessary for Handmade Hero?
🗪
1:56:55jessef Q: What are some advanced parsing features that are interesting to you but may be too much work / not necessary for Handmade Hero?
🗪
1:56:55jessef Q: What are some advanced parsing features that are interesting to you but may be too much work / not necessary for Handmade Hero?
🗪
1:59:39sgtrumbi Q: Wnat
🗪
1:59:39sgtrumbi Q: Wnat
🗪
1:59:39sgtrumbi Q: Wnat
🗪
1:59:56xxthebigfoxx Q: Are there things that recursive descent is not good for, or does it cut it for most of the parsing stuff?
🗪
1:59:56xxthebigfoxx Q: Are there things that recursive descent is not good for, or does it cut it for most of the parsing stuff?
🗪
1:59:56xxthebigfoxx Q: Are there things that recursive descent is not good for, or does it cut it for most of the parsing stuff?
🗪
2:01:39s0imn Q: What is your opinion of the Vulkan API, and its future?
🗪
2:01:39s0imn Q: What is your opinion of the Vulkan API, and its future?
🗪
2:01:39s0imn Q: What is your opinion of the Vulkan API, and its future?
🗪
2:01:59ivereadthesequel Q: I wasn't here for all of today's stream, but is RequireToken() what you'd use for lookahead (or a peektoken), ensuring you have an upcoming series of tokens to be of a specific form before you process those tokens?
🗪
2:01:59ivereadthesequel Q: I wasn't here for all of today's stream, but is RequireToken() what you'd use for lookahead (or a peektoken), ensuring you have an upcoming series of tokens to be of a specific form before you process those tokens?
🗪
2:01:59ivereadthesequel Q: I wasn't here for all of today's stream, but is RequireToken() what you'd use for lookahead (or a peektoken), ensuring you have an upcoming series of tokens to be of a specific form before you process those tokens?
🗪
2:06:57Bow out gracefully
🗩
2:06:57Bow out gracefully
🗩
2:06:57Bow out gracefully
🗩