mesa.git
14 years agoMake the lexer return SPACE tokens unconditionally.
Carl Worth [Thu, 13 May 2010 17:46:29 +0000 (10:46 -0700)]
Make the lexer return SPACE tokens unconditionally.

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.

14 years agoMakefile: Make "make test" depend on the main program.
Carl Worth [Thu, 13 May 2010 17:45:32 +0000 (10:45 -0700)]
Makefile: Make "make test" depend on the main program.

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).

14 years agoAdd some whitespace variations to test 15.
Carl Worth [Thu, 13 May 2010 17:41:53 +0000 (10:41 -0700)]
Add some whitespace variations to test 15.

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.

14 years agoFix parsing of object-like macro with a definition that begins with '('.
Carl Worth [Thu, 13 May 2010 17:29:07 +0000 (10:29 -0700)]
Fix parsing of object-like macro with a definition that begins with '('.

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).

14 years agoAdd test for an object-like macro with a definition beginning with '('
Carl Worth [Thu, 13 May 2010 17:26:58 +0000 (10:26 -0700)]
Add test for an object-like macro with a definition beginning with '('

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.

14 years agoEliminate a reduce/reduce conflict in the function-like macro production.
Carl Worth [Fri, 14 May 2010 15:47:32 +0000 (08:47 -0700)]
Eliminate a reduce/reduce conflict in the function-like macro production.

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.

14 years agoAdd support for the structure of function-like macros.
Carl Worth [Thu, 13 May 2010 16:36:23 +0000 (09:36 -0700)]
Add support for the structure of function-like macros.

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.

14 years agoAdd tests for the structure of function-like macros.
Carl Worth [Thu, 13 May 2010 16:34:21 +0000 (09:34 -0700)]
Add tests for the structure of function-like macros.

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.

14 years agoMake the lexer distinguish between identifiers and defined macros.
Carl Worth [Thu, 13 May 2010 14:38:29 +0000 (07:38 -0700)]
Make the lexer distinguish between identifiers and defined macros.

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.

14 years agoRemove some redundancy in the top-level production.
Carl Worth [Wed, 12 May 2010 20:21:20 +0000 (13:21 -0700)]
Remove some redundancy in the top-level production.

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.

14 years agoSimplify lexer significantly (remove all stateful lexing).
Carl Worth [Wed, 12 May 2010 20:19:23 +0000 (13:19 -0700)]
Simplify lexer significantly (remove all stateful lexing).

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).

14 years agoAdd test case to define, undef, and then again define a macro.
Carl Worth [Wed, 12 May 2010 20:14:08 +0000 (13:14 -0700)]
Add test case to define, undef, and then again define a macro.

Happily, this is another test case that works just fine without any
additional code.

14 years agoAdd support for the #undef macro.
Carl Worth [Wed, 12 May 2010 20:11:50 +0000 (13:11 -0700)]
Add support for the #undef macro.

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).

14 years agoAdd test for #undef.
Carl Worth [Wed, 12 May 2010 19:51:31 +0000 (12:51 -0700)]
Add test for #undef.

Which hasn't been implemented yet, so this test fails.

14 years agoAdd test for an empty definition.
Carl Worth [Wed, 12 May 2010 19:49:07 +0000 (12:49 -0700)]
Add test for an empty definition.

Happily this one passes without needing any additional code.

14 years agoConvert lexer to talloc and add xtalloc wrappers.
Carl Worth [Wed, 12 May 2010 19:45:33 +0000 (12:45 -0700)]
Convert lexer to talloc and add xtalloc wrappers.

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.

14 years agoFix defines involving both literals and other defined macros.
Carl Worth [Wed, 12 May 2010 19:17:10 +0000 (12:17 -0700)]
Fix defines involving both literals and other defined macros.

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.

14 years agoAdd tests defining a macro to be a literal and another macro.
Carl Worth [Tue, 11 May 2010 19:39:29 +0000 (12:39 -0700)]
Add tests defining a macro to be a literal and another macro.

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.

14 years agoAdd a couple more tests for chained #define directives.
Carl Worth [Tue, 11 May 2010 19:35:06 +0000 (12:35 -0700)]
Add a couple more tests for chained #define directives.

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.

14 years agoFix to handle chained #define directives.
Carl Worth [Tue, 11 May 2010 19:30:09 +0000 (12:30 -0700)]
Fix to handle chained #define directives.

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.

14 years agoAdd test for chained #define directives.
Carl Worth [Tue, 11 May 2010 19:29:22 +0000 (12:29 -0700)]
Add test for chained #define directives.

Where one macro is defined in terms of another macro. The current
implementation does not yet deal with this correctly.

14 years agoAdd README file describing glcpp.
Carl Worth [Tue, 11 May 2010 19:04:42 +0000 (12:04 -0700)]
Add README file describing glcpp.

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.

14 years agoAdd a very simple test for the pre-processor.
Carl Worth [Mon, 10 May 2010 23:21:10 +0000 (16:21 -0700)]
Add a very simple test for the pre-processor.

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.

14 years agoImplment #define
Carl Worth [Mon, 10 May 2010 23:16:06 +0000 (16:16 -0700)]
Implment #define

By using the recently-imported hash_table implementation.

14 years agoMakefile: Enable debugging of parser.
Carl Worth [Mon, 10 May 2010 23:14:59 +0000 (16:14 -0700)]
Makefile: Enable debugging of parser.

This compiles the debugging code for teh parser. It's not active
unless the yydebug variable is set to a non-zero value.

14 years agoAdd hash table implementation from glsl2 project.
Carl Worth [Mon, 10 May 2010 20:36:26 +0000 (13:36 -0700)]
Add hash table implementation from glsl2 project.

The preprocessor here is intended to become part of the glsl2 codebase
eventually anyway.

14 years agoAdd .gitignore file.
Carl Worth [Mon, 10 May 2010 20:32:42 +0000 (13:32 -0700)]
Add .gitignore file.

To ignore generated source files (and glcpp binary).

14 years agoAdd some compiler warnings and corresponding fixes.
Carl Worth [Mon, 10 May 2010 20:17:25 +0000 (13:17 -0700)]
Add some compiler warnings and corresponding fixes.

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).

14 years agoMake the lexer reentrant (to avoid "still reachable" memory).
Carl Worth [Mon, 10 May 2010 18:52:29 +0000 (11:52 -0700)]
Make the lexer reentrant (to avoid "still reachable" memory).

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.

14 years agoAdd the tiniest shell of a flex/bison-based parser.
Carl Worth [Mon, 10 May 2010 18:44:09 +0000 (11:44 -0700)]
Add the tiniest shell of a flex/bison-based parser.

It doesn't really *do* anything yet---merlely parsing a stream of
whitespace-separated tokens, (and not interpreting them at all).