+ my $res;
+ my $cur = $stream;
+
+ my $debug = 0;
+
+ print "$stream\n" if ($debug);
+
+ ##my $type = 'N';
+ my $pos = 0;
+ my $preprocessor = 0;
+ my $paren = 0;
+ my @paren_type;
+
+ # Include any user defined types we may have found as we went.
+ my $type_match = "(?:$Type$Bare)";
+
+ while (length($cur)) {
+ print " <$type> " if ($debug);
+ if ($cur =~ /^(\s+)/o) {
+ print "WS($1)\n" if ($debug);
+ if ($1 =~ /\n/ && $preprocessor) {
+ $preprocessor = 0;
+ $type = 'N';
+ }
+
+ } elsif ($cur =~ /^($type_match)/) {
+ print "DECLARE($1)\n" if ($debug);
+ $type = 'T';
+
+ } elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) {
+ print "DEFINE($1)\n" if ($debug);
+ $preprocessor = 1;
+ $paren_type[$paren] = 'N';
+
+ } elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if|else|endif))/o) {
+ print "PRE($1)\n" if ($debug);
+ $preprocessor = 1;
+ $type = 'N';
+
+ } elsif ($cur =~ /^(\\\n)/o) {
+ print "PRECONT($1)\n" if ($debug);
+
+ } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
+ print "SIZEOF($1)\n" if ($debug);
+ if (defined $2) {
+ $paren_type[$paren] = 'V';
+ }
+ $type = 'N';
+
+ } elsif ($cur =~ /^(if|while|typeof)\b/o) {
+ print "COND($1)\n" if ($debug);
+ $paren_type[$paren] = 'N';
+ $type = 'N';
+
+ } elsif ($cur =~/^(return|case|else)/o) {
+ print "KEYWORD($1)\n" if ($debug);
+ $type = 'N';
+
+ } elsif ($cur =~ /^(\()/o) {
+ print "PAREN('$1')\n" if ($debug);
+ $paren++;
+ $type = 'N';
+
+ } elsif ($cur =~ /^(\))/o) {
+ $paren-- if ($paren > 0);
+ if (defined $paren_type[$paren]) {
+ $type = $paren_type[$paren];
+ undef $paren_type[$paren];
+ print "PAREN('$1') -> $type\n" if ($debug);
+ } else {
+ print "PAREN('$1')\n" if ($debug);
+ }
+
+ } elsif ($cur =~ /^($Ident)\(/o) {
+ print "FUNC($1)\n" if ($debug);
+ $paren_type[$paren] = 'V';
+
+ } elsif ($cur =~ /^($Ident|$Constant)/o) {
+ print "IDENT($1)\n" if ($debug);
+ $type = 'V';
+
+ } elsif ($cur =~ /^($Assignment)/o) {
+ print "ASSIGN($1)\n" if ($debug);
+ $type = 'N';
+
+ } elsif ($cur =~ /^(;|{|}|\?|:|\[)/o) {
+ print "END($1)\n" if ($debug);
+ $type = 'N';
+
+ } elsif ($cur =~ /^($Operators)/o) {
+ print "OP($1)\n" if ($debug);
+ if ($1 ne '++' && $1 ne '--') {
+ $type = 'N';
+ }
+
+ } elsif ($cur =~ /(^.)/o) {
+ print "C($1)\n" if ($debug);
+ }
+ if (defined $1) {
+ $cur = substr($cur, length($1));
+ $res .= $type x length($1);
+ }