dummy_foundation/lib/Parse/Yapp/Parse.pm
changeset 0 02cd6b52f378
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dummy_foundation/lib/Parse/Yapp/Parse.pm	Thu May 28 10:10:03 2009 +0100
@@ -0,0 +1,1093 @@
+####################################################################
+#
+#    This file was generated using Parse::Yapp version 1.05.
+#
+#        Don't edit this file, use source file instead.
+#
+#             ANY CHANGE MADE HERE WILL BE LOST !
+#
+####################################################################
+package Parse::Yapp::Parse;
+use vars qw ( @ISA );
+use strict;
+
+@ISA= qw ( Parse::Yapp::Driver );
+use Parse::Yapp::Driver;
+
+#line 1 "YappParse.yp"
+# (c) Copyright Francois Desarmenien 1998-2001, all rights reserved.
+# (see COPYRIGHT in Parse::Yapp.pm pod section for use and distribution rights)
+#
+# Parse/Yapp/Parser.yp: Parse::Yapp::Parser.pm source file
+#
+# Use: yapp -m 'Parse::Yapp::Parse' -o Parse/Yapp/Parse.pm YappParse.yp
+#
+# to generate the Parser module.
+# 
+#line 12 "YappParse.yp"
+
+require 5.004;
+
+use Carp;
+
+my($input,$lexlevel,@lineno,$nberr,$prec,$labelno);
+my($syms,$head,$tail,$token,$term,$nterm,$rules,$precterm,$start,$nullable);
+my($expect);
+
+
+
+sub new {
+        my($class)=shift;
+        ref($class)
+    and $class=ref($class);
+
+    my($self)=$class->SUPER::new( yyversion => '1.05',
+                                  yystates =>
+[
+	{#State 0
+		ACTIONS => {
+			"%%" => -6,
+			'HEADCODE' => 3,
+			'UNION' => 2,
+			'TOKEN' => 5,
+			'ASSOC' => 7,
+			'START' => 6,
+			'error' => 9,
+			'TYPE' => 10,
+			"\n" => 11,
+			'EXPECT' => 13
+		},
+		GOTOS => {
+			'head' => 1,
+			'decls' => 12,
+			'yapp' => 4,
+			'decl' => 14,
+			'headsec' => 8
+		}
+	},
+	{#State 1
+		ACTIONS => {
+			'error' => 19,
+			"%%" => 16,
+			'IDENT' => 18
+		},
+		GOTOS => {
+			'rules' => 15,
+			'rulesec' => 20,
+			'body' => 17
+		}
+	},
+	{#State 2
+		ACTIONS => {
+			'CODE' => 21
+		}
+	},
+	{#State 3
+		ACTIONS => {
+			"\n" => 22
+		}
+	},
+	{#State 4
+		ACTIONS => {
+			'' => 23
+		}
+	},
+	{#State 5
+		ACTIONS => {
+			"<" => 25
+		},
+		DEFAULT => -19,
+		GOTOS => {
+			'typedecl' => 24
+		}
+	},
+	{#State 6
+		ACTIONS => {
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'ident' => 27
+		}
+	},
+	{#State 7
+		ACTIONS => {
+			"<" => 25
+		},
+		DEFAULT => -19,
+		GOTOS => {
+			'typedecl' => 28
+		}
+	},
+	{#State 8
+		ACTIONS => {
+			"%%" => 29
+		}
+	},
+	{#State 9
+		ACTIONS => {
+			"\n" => 30
+		}
+	},
+	{#State 10
+		ACTIONS => {
+			"<" => 25
+		},
+		DEFAULT => -19,
+		GOTOS => {
+			'typedecl' => 31
+		}
+	},
+	{#State 11
+		DEFAULT => -10
+	},
+	{#State 12
+		ACTIONS => {
+			"%%" => -7,
+			'HEADCODE' => 3,
+			'UNION' => 2,
+			'TOKEN' => 5,
+			'ASSOC' => 7,
+			'START' => 6,
+			'error' => 9,
+			'TYPE' => 10,
+			"\n" => 11,
+			'EXPECT' => 13
+		},
+		GOTOS => {
+			'decl' => 32
+		}
+	},
+	{#State 13
+		ACTIONS => {
+			'NUMBER' => 33
+		}
+	},
+	{#State 14
+		DEFAULT => -9
+	},
+	{#State 15
+		DEFAULT => -28
+	},
+	{#State 16
+		DEFAULT => -26
+	},
+	{#State 17
+		ACTIONS => {
+			'TAILCODE' => 34
+		},
+		DEFAULT => -45,
+		GOTOS => {
+			'tail' => 35
+		}
+	},
+	{#State 18
+		ACTIONS => {
+			":" => 36
+		}
+	},
+	{#State 19
+		ACTIONS => {
+			";" => 37
+		}
+	},
+	{#State 20
+		ACTIONS => {
+			'error' => 19,
+			"%%" => 39,
+			'IDENT' => 18
+		},
+		GOTOS => {
+			'rules' => 38
+		}
+	},
+	{#State 21
+		ACTIONS => {
+			"\n" => 40
+		}
+	},
+	{#State 22
+		DEFAULT => -14
+	},
+	{#State 23
+		DEFAULT => -0
+	},
+	{#State 24
+		ACTIONS => {
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'symlist' => 43,
+			'ident' => 44,
+			'symbol' => 42
+		}
+	},
+	{#State 25
+		ACTIONS => {
+			'IDENT' => 45
+		}
+	},
+	{#State 26
+		DEFAULT => -4
+	},
+	{#State 27
+		ACTIONS => {
+			"\n" => 46
+		}
+	},
+	{#State 28
+		ACTIONS => {
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'symlist' => 47,
+			'ident' => 44,
+			'symbol' => 42
+		}
+	},
+	{#State 29
+		DEFAULT => -5
+	},
+	{#State 30
+		DEFAULT => -18
+	},
+	{#State 31
+		ACTIONS => {
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'ident' => 48,
+			'identlist' => 49
+		}
+	},
+	{#State 32
+		DEFAULT => -8
+	},
+	{#State 33
+		ACTIONS => {
+			"\n" => 50
+		}
+	},
+	{#State 34
+		DEFAULT => -46
+	},
+	{#State 35
+		DEFAULT => -1
+	},
+	{#State 36
+		ACTIONS => {
+			'CODE' => 57,
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		DEFAULT => -35,
+		GOTOS => {
+			'rhselts' => 56,
+			'rule' => 51,
+			'code' => 52,
+			'rhs' => 53,
+			'ident' => 44,
+			'rhselt' => 58,
+			'rhss' => 55,
+			'symbol' => 54
+		}
+	},
+	{#State 37
+		DEFAULT => -30
+	},
+	{#State 38
+		DEFAULT => -27
+	},
+	{#State 39
+		DEFAULT => -25
+	},
+	{#State 40
+		DEFAULT => -15
+	},
+	{#State 41
+		DEFAULT => -2
+	},
+	{#State 42
+		DEFAULT => -22
+	},
+	{#State 43
+		ACTIONS => {
+			"\n" => 60,
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'ident' => 44,
+			'symbol' => 59
+		}
+	},
+	{#State 44
+		DEFAULT => -3
+	},
+	{#State 45
+		ACTIONS => {
+			">" => 61
+		}
+	},
+	{#State 46
+		DEFAULT => -13
+	},
+	{#State 47
+		ACTIONS => {
+			"\n" => 62,
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'ident' => 44,
+			'symbol' => 59
+		}
+	},
+	{#State 48
+		DEFAULT => -24
+	},
+	{#State 49
+		ACTIONS => {
+			"\n" => 63,
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'ident' => 64
+		}
+	},
+	{#State 50
+		DEFAULT => -17
+	},
+	{#State 51
+		DEFAULT => -32
+	},
+	{#State 52
+		DEFAULT => -40
+	},
+	{#State 53
+		ACTIONS => {
+			'PREC' => 66
+		},
+		DEFAULT => -34,
+		GOTOS => {
+			'prec' => 65
+		}
+	},
+	{#State 54
+		DEFAULT => -39
+	},
+	{#State 55
+		ACTIONS => {
+			"|" => 68,
+			";" => 67
+		}
+	},
+	{#State 56
+		ACTIONS => {
+			'CODE' => 57,
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		DEFAULT => -36,
+		GOTOS => {
+			'code' => 52,
+			'ident' => 44,
+			'rhselt' => 69,
+			'symbol' => 54
+		}
+	},
+	{#State 57
+		DEFAULT => -44
+	},
+	{#State 58
+		DEFAULT => -38
+	},
+	{#State 59
+		DEFAULT => -21
+	},
+	{#State 60
+		DEFAULT => -11
+	},
+	{#State 61
+		DEFAULT => -20
+	},
+	{#State 62
+		DEFAULT => -12
+	},
+	{#State 63
+		DEFAULT => -16
+	},
+	{#State 64
+		DEFAULT => -23
+	},
+	{#State 65
+		ACTIONS => {
+			'CODE' => 57
+		},
+		DEFAULT => -42,
+		GOTOS => {
+			'code' => 70,
+			'epscode' => 71
+		}
+	},
+	{#State 66
+		ACTIONS => {
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		GOTOS => {
+			'ident' => 44,
+			'symbol' => 72
+		}
+	},
+	{#State 67
+		DEFAULT => -29
+	},
+	{#State 68
+		ACTIONS => {
+			'CODE' => 57,
+			'LITERAL' => 41,
+			'IDENT' => 26
+		},
+		DEFAULT => -35,
+		GOTOS => {
+			'rhselts' => 56,
+			'rule' => 73,
+			'code' => 52,
+			'rhs' => 53,
+			'ident' => 44,
+			'rhselt' => 58,
+			'symbol' => 54
+		}
+	},
+	{#State 69
+		DEFAULT => -37
+	},
+	{#State 70
+		DEFAULT => -43
+	},
+	{#State 71
+		DEFAULT => -33
+	},
+	{#State 72
+		DEFAULT => -41
+	},
+	{#State 73
+		DEFAULT => -31
+	}
+],
+                                  yyrules  =>
+[
+	[#Rule 0
+		 '$start', 2, undef
+	],
+	[#Rule 1
+		 'yapp', 3, undef
+	],
+	[#Rule 2
+		 'symbol', 1,
+sub
+#line 30 "YappParse.yp"
+{
+                        exists($$syms{$_[1][0]})
+                    or  do {
+                        $$syms{$_[1][0]} = $_[1][1];
+                        $$term{$_[1][0]} = undef;
+                    };
+                    $_[1]
+                }
+	],
+	[#Rule 3
+		 'symbol', 1, undef
+	],
+	[#Rule 4
+		 'ident', 1,
+sub
+#line 41 "YappParse.yp"
+{
+                        exists($$syms{$_[1][0]})
+                    or  do {
+                        $$syms{$_[1][0]} = $_[1][1];
+                        $$term{$_[1][0]} = undef;
+                    };
+                    $_[1]
+                }
+	],
+	[#Rule 5
+		 'head', 2, undef
+	],
+	[#Rule 6
+		 'headsec', 0, undef
+	],
+	[#Rule 7
+		 'headsec', 1, undef
+	],
+	[#Rule 8
+		 'decls', 2, undef
+	],
+	[#Rule 9
+		 'decls', 1, undef
+	],
+	[#Rule 10
+		 'decl', 1, undef
+	],
+	[#Rule 11
+		 'decl', 4,
+sub
+#line 66 "YappParse.yp"
+{
+                for (@{$_[3]}) {
+                    my($symbol,$lineno)=@$_;
+
+                        exists($$token{$symbol})
+                    and do {
+                        _SyntaxError(0,
+                                "Token $symbol redefined: ".
+                                "Previously defined line $$syms{$symbol}",
+                                $lineno);
+                        next;
+                    };
+                    $$token{$symbol}=$lineno;
+                    $$term{$symbol} = [ ];
+                }
+                undef
+            }
+	],
+	[#Rule 12
+		 'decl', 4,
+sub
+#line 84 "YappParse.yp"
+{
+                for (@{$_[3]}) {
+                    my($symbol,$lineno)=@$_;
+
+                        defined($$term{$symbol}[0])
+                    and do {
+                        _SyntaxError(1,
+                            "Precedence for symbol $symbol redefined: ".
+                            "Previously defined line $$syms{$symbol}",
+                            $lineno);
+                        next;
+                    };
+                    $$token{$symbol}=$lineno;
+                    $$term{$symbol} = [ $_[1][0], $prec ];
+                }
+                ++$prec;
+                undef
+            }
+	],
+	[#Rule 13
+		 'decl', 3,
+sub
+#line 102 "YappParse.yp"
+{ $start=$_[2][0]; undef }
+	],
+	[#Rule 14
+		 'decl', 2,
+sub
+#line 103 "YappParse.yp"
+{ push(@$head,$_[1]); undef }
+	],
+	[#Rule 15
+		 'decl', 3,
+sub
+#line 104 "YappParse.yp"
+{ undef }
+	],
+	[#Rule 16
+		 'decl', 4,
+sub
+#line 106 "YappParse.yp"
+{
+                for ( @{$_[3]} ) {
+                    my($symbol,$lineno)=@$_;
+
+                        exists($$nterm{$symbol})
+                    and do {
+                        _SyntaxError(0,
+                                "Non-terminal $symbol redefined: ".
+                                "Previously defined line $$syms{$symbol}",
+                                $lineno);
+                        next;
+                    };
+                    delete($$term{$symbol});   #not a terminal
+                    $$nterm{$symbol}=undef;    #is a non-terminal
+                }
+            }
+	],
+	[#Rule 17
+		 'decl', 3,
+sub
+#line 122 "YappParse.yp"
+{ $expect=$_[2][0]; undef }
+	],
+	[#Rule 18
+		 'decl', 2,
+sub
+#line 123 "YappParse.yp"
+{ $_[0]->YYErrok }
+	],
+	[#Rule 19
+		 'typedecl', 0, undef
+	],
+	[#Rule 20
+		 'typedecl', 3, undef
+	],
+	[#Rule 21
+		 'symlist', 2,
+sub
+#line 130 "YappParse.yp"
+{ push(@{$_[1]},$_[2]); $_[1] }
+	],
+	[#Rule 22
+		 'symlist', 1,
+sub
+#line 131 "YappParse.yp"
+{ [ $_[1] ] }
+	],
+	[#Rule 23
+		 'identlist', 2,
+sub
+#line 134 "YappParse.yp"
+{ push(@{$_[1]},$_[2]); $_[1] }
+	],
+	[#Rule 24
+		 'identlist', 1,
+sub
+#line 135 "YappParse.yp"
+{ [ $_[1] ] }
+	],
+	[#Rule 25
+		 'body', 2,
+sub
+#line 140 "YappParse.yp"
+{
+                    $start
+                or  $start=$$rules[1][0];
+
+                    ref($$nterm{$start})
+                or  _SyntaxError(2,"Start symbol $start not found ".
+                                   "in rules section",$_[2][1]);
+
+                $$rules[0]=[ '$start', [ $start, chr(0) ], undef, undef ];
+            }
+	],
+	[#Rule 26
+		 'body', 1,
+sub
+#line 150 "YappParse.yp"
+{ _SyntaxError(2,"No rules in input grammar",$_[1][1]); }
+	],
+	[#Rule 27
+		 'rulesec', 2, undef
+	],
+	[#Rule 28
+		 'rulesec', 1, undef
+	],
+	[#Rule 29
+		 'rules', 4,
+sub
+#line 157 "YappParse.yp"
+{ _AddRules($_[1],$_[3]); undef }
+	],
+	[#Rule 30
+		 'rules', 2,
+sub
+#line 158 "YappParse.yp"
+{ $_[0]->YYErrok }
+	],
+	[#Rule 31
+		 'rhss', 3,
+sub
+#line 161 "YappParse.yp"
+{ push(@{$_[1]},$_[3]); $_[1] }
+	],
+	[#Rule 32
+		 'rhss', 1,
+sub
+#line 162 "YappParse.yp"
+{ [ $_[1] ] }
+	],
+	[#Rule 33
+		 'rule', 3,
+sub
+#line 165 "YappParse.yp"
+{ push(@{$_[1]}, $_[2], $_[3]); $_[1] }
+	],
+	[#Rule 34
+		 'rule', 1,
+sub
+#line 166 "YappParse.yp"
+{
+                                my($code)=undef;
+
+                                    defined($_[1])
+                                and $_[1][-1][0] eq 'CODE'
+                                and $code = ${pop(@{$_[1]})}[1];
+
+                                push(@{$_[1]}, undef, $code);
+
+                                $_[1]
+                            }
+	],
+	[#Rule 35
+		 'rhs', 0, undef
+	],
+	[#Rule 36
+		 'rhs', 1, undef
+	],
+	[#Rule 37
+		 'rhselts', 2,
+sub
+#line 183 "YappParse.yp"
+{ push(@{$_[1]},$_[2]); $_[1] }
+	],
+	[#Rule 38
+		 'rhselts', 1,
+sub
+#line 184 "YappParse.yp"
+{ [ $_[1] ] }
+	],
+	[#Rule 39
+		 'rhselt', 1,
+sub
+#line 187 "YappParse.yp"
+{ [ 'SYMB', $_[1] ] }
+	],
+	[#Rule 40
+		 'rhselt', 1,
+sub
+#line 188 "YappParse.yp"
+{ [ 'CODE', $_[1] ] }
+	],
+	[#Rule 41
+		 'prec', 2,
+sub
+#line 192 "YappParse.yp"
+{
+                       	defined($$term{$_[2][0]})
+                    or  do {
+                        _SyntaxError(1,"No precedence for symbol $_[2][0]",
+                                         $_[2][1]);
+                        return undef;
+                    };
+
+                    ++$$precterm{$_[2][0]};
+                    $$term{$_[2][0]}[1];
+				}
+	],
+	[#Rule 42
+		 'epscode', 0,
+sub
+#line 205 "YappParse.yp"
+{ undef }
+	],
+	[#Rule 43
+		 'epscode', 1,
+sub
+#line 206 "YappParse.yp"
+{ $_[1] }
+	],
+	[#Rule 44
+		 'code', 1,
+sub
+#line 209 "YappParse.yp"
+{ $_[1] }
+	],
+	[#Rule 45
+		 'tail', 0, undef
+	],
+	[#Rule 46
+		 'tail', 1,
+sub
+#line 215 "YappParse.yp"
+{ $tail=$_[1] }
+	]
+],
+                                  @_);
+    bless($self,$class);
+}
+
+#line 218 "YappParse.yp"
+
+sub _Error {
+    my($value)=$_[0]->YYCurval;
+
+    my($what)= $token ? "input: '$$value[0]'" : "end of input";
+
+    _SyntaxError(1,"Unexpected $what",$$value[1]);
+}
+
+sub _Lexer {
+ 
+    #At EOF
+        pos($$input) >= length($$input)
+    and return('',[ undef, -1 ]);
+
+    #In TAIL section
+        $lexlevel > 1
+    and do {
+        my($pos)=pos($$input);
+
+        $lineno[0]=$lineno[1];
+        $lineno[1]=-1;
+        pos($$input)=length($$input);
+        return('TAILCODE',[ substr($$input,$pos), $lineno[0] ]);
+    };
+
+    #Skip blanks
+            $lexlevel == 0
+        ?   $$input=~m{\G((?:
+                                [\t\ ]+    # Any white space char but \n
+                            |   \#[^\n]*  # Perl like comments
+                            |   /\*.*?\*/ # C like comments
+                            )+)}xsgc
+        :   $$input=~m{\G((?:
+                                \s+       # any white space char
+                            |   \#[^\n]*  # Perl like comments
+                            |   /\*.*?\*/ # C like comments
+                            )+)}xsgc
+    and do {
+        my($blanks)=$1;
+
+        #Maybe At EOF
+            pos($$input) >= length($$input)
+        and return('',[ undef, -1 ]);
+
+        $lineno[1]+= $blanks=~tr/\n//;
+    };
+
+    $lineno[0]=$lineno[1];
+
+        $$input=~/\G([A-Za-z_][A-Za-z0-9_]*)/gc
+    and return('IDENT',[ $1, $lineno[0] ]);
+
+        $$input=~/\G('(?:[^'\\]|\\\\|\\'|\\)+?')/gc
+    and do {
+            $1 eq "'error'"
+        and do {
+            _SyntaxError(0,"Literal 'error' ".
+                           "will be treated as error token",$lineno[0]);
+            return('IDENT',[ 'error', $lineno[0] ]);
+        };
+        return('LITERAL',[ $1, $lineno[0] ]);
+    };
+
+        $$input=~/\G(%%)/gc
+    and do {
+        ++$lexlevel;
+        return($1, [ $1, $lineno[0] ]);
+    };
+
+        $$input=~/\G{/gc
+    and do {
+        my($level,$from,$code);
+
+        $from=pos($$input);
+
+        $level=1;
+        while($$input=~/([{}])/gc) {
+                substr($$input,pos($$input)-1,1) eq '\\' #Quoted
+            and next;
+                $level += ($1 eq '{' ? 1 : -1)
+            or last;
+        }
+            $level
+        and  _SyntaxError(2,"Unmatched { opened line $lineno[0]",-1);
+        $code = substr($$input,$from,pos($$input)-$from-1);
+        $lineno[1]+= $code=~tr/\n//;
+        return('CODE',[ $code, $lineno[0] ]);
+    };
+
+    if($lexlevel == 0) {# In head section
+            $$input=~/\G%(left|right|nonassoc)/gc
+        and return('ASSOC',[ uc($1), $lineno[0] ]);
+            $$input=~/\G%(start)/gc
+        and return('START',[ undef, $lineno[0] ]);
+            $$input=~/\G%(expect)/gc
+        and return('EXPECT',[ undef, $lineno[0] ]);
+            $$input=~/\G%{/gc
+        and do {
+            my($code);
+
+                $$input=~/\G(.*?)%}/sgc
+            or  _SyntaxError(2,"Unmatched %{ opened line $lineno[0]",-1);
+
+            $code=$1;
+            $lineno[1]+= $code=~tr/\n//;
+            return('HEADCODE',[ $code, $lineno[0] ]);
+        };
+            $$input=~/\G%(token)/gc
+        and return('TOKEN',[ undef, $lineno[0] ]);
+            $$input=~/\G%(type)/gc
+        and return('TYPE',[ undef, $lineno[0] ]);
+            $$input=~/\G%(union)/gc
+        and return('UNION',[ undef, $lineno[0] ]);
+            $$input=~/\G([0-9]+)/gc
+        and return('NUMBER',[ $1, $lineno[0] ]);
+
+    }
+    else {# In rule section
+            $$input=~/\G%(prec)/gc
+        and return('PREC',[ undef, $lineno[0] ]);
+    }
+
+    #Always return something
+        $$input=~/\G(.)/sg
+    or  die "Parse::Yapp::Grammar::Parse: Match (.) failed: report as a BUG";
+
+        $1 eq "\n"
+    and ++$lineno[1];
+
+    ( $1 ,[ $1, $lineno[0] ]);
+
+}
+
+sub _SyntaxError {
+    my($level,$message,$lineno)=@_;
+
+    $message= "*".
+              [ 'Warning', 'Error', 'Fatal' ]->[$level].
+              "* $message, at ".
+              ($lineno < 0 ? "eof" : "line $lineno").
+              ".\n";
+
+        $level > 1
+    and die $message;
+
+    warn $message;
+
+        $level > 0
+    and ++$nberr;
+
+        $nberr == 20 
+    and die "*Fatal* Too many errors detected.\n"
+}
+
+sub _AddRules {
+    my($lhs,$lineno)=@{$_[0]};
+    my($rhss)=$_[1];
+
+        ref($$nterm{$lhs})
+    and do {
+        _SyntaxError(1,"Non-terminal $lhs redefined: ".
+                       "Previously declared line $$syms{$lhs}",$lineno);
+        return;
+    };
+
+        ref($$term{$lhs})
+    and do {
+        my($where) = exists($$token{$lhs}) ? $$token{$lhs} : $$syms{$lhs};
+        _SyntaxError(1,"Non-terminal $lhs previously ".
+                       "declared as token line $where",$lineno);
+        return;
+    };
+
+        ref($$nterm{$lhs})      #declared through %type
+    or  do {
+            $$syms{$lhs}=$lineno;   #Say it's declared here
+            delete($$term{$lhs});   #No more a terminal
+    };
+    $$nterm{$lhs}=[];       #It's a non-terminal now
+
+    my($epsrules)=0;        #To issue a warning if more than one epsilon rule
+
+    for my $rhs (@$rhss) {
+        my($tmprule)=[ $lhs, [ ], splice(@$rhs,-2) ]; #Init rule
+
+            @$rhs
+        or  do {
+            ++$$nullable{$lhs};
+            ++$epsrules;
+        };
+
+        for (0..$#$rhs) {
+            my($what,$value)=@{$$rhs[$_]};
+
+                $what eq 'CODE'
+            and do {
+                my($name)='@'.++$labelno."-$_";
+                push(@$rules,[ $name, [], undef, $value ]);
+                push(@{$$tmprule[1]},$name);
+                next;
+            };
+            push(@{$$tmprule[1]},$$value[0]);
+        }
+        push(@$rules,$tmprule);
+        push(@{$$nterm{$lhs}},$#$rules);
+    }
+
+        $epsrules > 1
+    and _SyntaxError(0,"More than one empty rule for symbol $lhs",$lineno);
+}
+
+sub Parse {
+    my($self)=shift;
+
+        @_ > 0
+    or  croak("No input grammar\n");
+
+    my($parsed)={};
+
+    $input=\$_[0];
+
+    $lexlevel=0;
+    @lineno=(1,1);
+    $nberr=0;
+    $prec=0;
+    $labelno=0;
+
+    $head=();
+    $tail="";
+
+    $syms={};
+    $token={};
+    $term={};
+    $nterm={};
+    $rules=[ undef ];   #reserve slot 0 for start rule
+    $precterm={};
+
+    $start="";
+    $nullable={};
+    $expect=0;
+
+    pos($$input)=0;
+
+
+    $self->YYParse(yylex => \&_Lexer, yyerror => \&_Error);
+
+        $nberr
+    and _SyntaxError(2,"Errors detected: No output",-1);
+
+    @$parsed{ 'HEAD', 'TAIL', 'RULES', 'NTERM', 'TERM',
+              'NULL', 'PREC', 'SYMS',  'START', 'EXPECT' }
+    =       (  $head,  $tail,  $rules,  $nterm,  $term,
+               $nullable, $precterm, $syms, $start, $expect);
+
+    undef($input);
+    undef($lexlevel);
+    undef(@lineno);
+    undef($nberr);
+    undef($prec);
+    undef($labelno);
+
+    undef($head);
+    undef($tail);
+
+    undef($syms);
+    undef($token);
+    undef($term);
+    undef($nterm);
+    undef($rules);
+    undef($precterm);
+
+    undef($start);
+    undef($nullable);
+    undef($expect);
+
+    $parsed
+}
+
+
+1;