read the next token into this.string
if it is alphanumeric, classify_string
else it must be a single character token
this.type = the token itself; terminate this.string
with a nul.
read_to_first_identifier
gettoken and push it onto the stack until the first
identifier is read.
Print "identifier is", this.string
gettoken
parsing routines----------
deal_with_function_args
read past closing ')' print out "function returning"
deal_with_arrays
while you've got "[size]" print it out and read past
it
deal_with_any_pointers
while you've got "*" on the stack print "pointer to"
and pop it
deal_with_declarator
if this.type is '[' deal_with_arrays
if this.type is '(' deal_with_function_args
deal_with_any_pointers
while there's stuff on the stack
if it's a '('
pop it and gettoken; it should be the closing ')'
deal_with_declarator
else pop it and print it
main routine----------
main
read_to_first_identifier
deal_with_declarator
This is a small program that has been written numerous times over the years, often under the name
"cdecl". [1] An incomplete version of cdecl appears in The C Programming Language. The cdecl
specified here is more complete; it supports the type qualifiers "const" and "volatile". It also knows
about structs, enums, and unions though not in full generality; it is easy to extend this version to
handle argument declarations in functions. This program can be implemented with about 150 lines of
C. Adding error handling, and the full generality of declarations, would make it much larger. In any
event, when you program this parser, you are implementing one of the major subsystems in a
compiler—that's a substantial programming achievement, and one that will really help you to gain a
deep understanding of this area.