summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2010-05-14Remove _list suffix from several identifiers.Carl Worth
Instead of "parameter_list" and "replacement_list" just use "parameters" and "replacements". This is consistent with the existing "arguments" and keeps the line length down in the face of the now-longer "string_list_t" rather than "list_t".
2010-05-14Rename list_t and node_t to string_list_t and string_node_t.Carl Worth
We'll soon be adding other types of lists, so it will be helpful to have a qualified name here.
2010-05-14Fix case of a macro formal parameter matching a defined macro.Carl Worth
Simply need to allow for a macro name to appear in the parameter list. This makes the recently-added test pass.
2010-05-14Add test where a macro formal parameter is the same as an existing macro.Carl Worth
This is a well-defined condition, but something that currently trips up the implementation. Should be easy to fix.
2010-05-14Implement substitution of macro arguments.Carl Worth
Making the two recently-added tests for this functionality now pass.
2010-05-14Add tests exercising substitution of arguments in function-like macros.Carl Worth
This capability is the only thing that makes function-like macros interesting. This isn't supported yet so these tests fail for now.
2010-05-14Make the lexer return SPACE tokens unconditionally.Carl Worth
It seems strange to always be returning SPACE tokens, but since we were already needing to return a SPACE token in some cases, this actually simplifies our lexer. This also allows us to fix two whitespace-handling differences compared to "gcc -E" so that now the recent modification to the test suite passes once again.
2010-05-14Makefile: Make "make test" depend on the main program.Carl Worth
Otherwise, running "make test" can run an old version of the code, (even when new changes are sitting in the source waiting to be compiled).
2010-05-14Add some whitespace variations to test 15.Carl Worth
This shows two minor failures in our current parsing (resulting in whitespace-only changes, oso not that significant): 1. We are inserting extra whitespace between tokens not originally separated by whitespace in the replacement list of a macro definition. 2. We are swallowing whitespace separating tokens in the general content.
2010-05-14Fix parsing of object-like macro with a definition that begins with '('.Carl Worth
Previously our parser was incorrectly treating this case as a function-like macro. We fix this by conditionally passing a SPACE token from the lexer, (but only immediately after the identifier immediately after #define).
2010-05-14Add test for an object-like macro with a definition beginning with '('Carl Worth
Our current parser sees "#define foo (" as an identifier token followed by a '(' token and parses this as a function-like macro. That would be correct for "#define foo(" but the preprocessor specification treats this whitespace as significant here so this test currently fails.
2010-05-14Eliminate a reduce/reduce conflict in the function-like macro production.Carl Worth
Previously, an empty argument could be parsed as either an "argument_list" directly or first as an "argument" and then an "argument_list". We fix this by removing the possibility of an empty "argument_list" directly.
2010-05-13Add support for the structure of function-like macros.Carl Worth
We accept the structure of arguments in both macro definition and macro invocation, but we don't yet expand those arguments. This is just enough code to pass the recently-added tests, but does not yet provide any sort of useful function-like macro.
2010-05-13Add tests for the structure of function-like macros.Carl Worth
These test only the most basic aspect of parsing of function-like macros. Specifically, none of the definitions of these function like macros use the arguments of the function. No function-like macros are implemented yet, so all of these fail for now.
2010-05-13Make the lexer distinguish between identifiers and defined macros.Carl Worth
This is just a minor style improvement for now. But the same mechanism, (having the lexer peek into the table of defined macros), will be essential when we add function-like macros in addition to the current object-like macros.
2010-05-12Remove some redundancy in the top-level production.Carl Worth
Previously we had two copies of all top-level actions, (once in a list context and once in a non-list context). Much simpler to instead have a single list-context production with no action and then only have the actions in their own non-list contexts.
2010-05-12Simplify lexer significantly (remove all stateful lexing).Carl Worth
We are able to remove all state by simply passing NEWLINE through as a token unconditionally (as opposed to only passing newline when on a driective line as we did previously).
2010-05-12Add test case to define, undef, and then again define a macro.Carl Worth
Happily, this is another test case that works just fine without any additional code.
2010-05-12Add support for the #undef macro.Carl Worth
This isn't ideal for two reasons: 1. There's a bunch of stateful redundancy in the lexer that should be cleaned up. 2. The hash table does not provide a mechanism to delete an entry, so we waste memory to add a new NULL entry in front of the existing entry with the same key. But this does at least work, (it passes the recently added undef test case).
2010-05-12Add test for #undef.Carl Worth
Which hasn't been implemented yet, so this test fails.
2010-05-12Add test for an empty definition.Carl Worth
Happily this one passes without needing any additional code.
2010-05-12Convert lexer to talloc and add xtalloc wrappers.Carl Worth
The lexer was previously using strdup (expecting the parser to free), but is now more consistent, easier to use, and slightly more efficent by using talloc along with the parser. Also, we add xtalloc and xtalloc_strdup wrappers around talloc and talloc_strdup to put all of the out-of-memory-checking code in one place.
2010-05-12Fix defines involving both literals and other defined macros.Carl Worth
We now store a list of tokens in our hash-table rather than a single string. This lets us replace each macro in the value as necessary. This code adds a link dependency on talloc which does exactly what we want in terms of memory management for a parser. The 3 tests added in the previous commit now pass.
2010-05-11Add tests defining a macro to be a literal and another macro.Carl Worth
These 3 new tests are modeled after 3 existing tests but made slightly more complex since now instead of definining a new macro to be an existing macro, we define it to be replaced with two tokens, (one a literal, and one an existing macro). These tests all fail currently because the replacement lookup is currently happening on the basis of the entire replacement string rather than on a list of tokens.
2010-05-11Add a couple more tests for chained #define directives.Carl Worth
One with the chained defines in the opposite order, and one with the potential to trigger an infinite-loop bug through mutual recursion. Each of these tests pass already.
2010-05-11Fix to handle chained #define directives.Carl Worth
The fix is as simple as adding a loop to continue to lookup values in the hash table until one of the following termination conditions: 1. The token we look up has no definition 2. We get back the original symbol we started with This second termination condition prevents infinite iteration.
2010-05-11Add test for chained #define directives.Carl Worth
Where one macro is defined in terms of another macro. The current implementation does not yet deal with this correctly.
2010-05-11Add README file describing glcpp.Carl Worth
Mostly this is a place for me to write down the URLs of the GLSL and C99 specifications that I need to write this code.
2010-05-10Add a very simple test for the pre-processor.Carl Worth
Validate desired test cases by ensuring the output of glcpp matches the output of the gcc preprocessor, (ignoring any lines of the gcc output beginning with '#'). Only one test case so far with a trivial #define.
2010-05-10Implment #defineCarl Worth
By using the recently-imported hash_table implementation.
2010-05-10Makefile: Enable debugging of parser.Carl Worth
This compiles the debugging code for teh parser. It's not active unless the yydebug variable is set to a non-zero value.
2010-05-10Add hash table implementation from glsl2 project.Carl Worth
The preprocessor here is intended to become part of the glsl2 codebase eventually anyway.
2010-05-10Add .gitignore file.Carl Worth
To ignore generated source files (and glcpp binary).
2010-05-10Add some compiler warnings and corresponding fixes.Carl Worth
Most of the current problems were (mostly) harmless things like missing declarations, but there was at least one real error, (reversed argument order for yyerrror).
2010-05-10Make the lexer reentrant (to avoid "still reachable" memory).Carl Worth
This allows the final program to be 100% "valgrind clean", (freeing all memory that it allocates). This will make it much easier to ensure that any allocation that parser actions perform are also cleaned up.
2010-05-10Add the tiniest shell of a flex/bison-based parser.Carl Worth
It doesn't really *do* anything yet---merlely parsing a stream of whitespace-separated tokens, (and not interpreting them at all).