summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVishal Gupta <vishalgupta7972@gmail.com>2018-06-16 12:09:17 +0530
committerVishal Gupta <vishalgupta7972@gmail.com>2018-06-16 12:09:17 +0530
commitc538dc193d39be7df03615d4d4792ec4c1aedf97 (patch)
treef4bf1fc5f6ca8414315d1d31d18b8e06aac4bd1d
parentacb396f294d1ef3b7c0a399d01b1388cd32be68d (diff)
downloadautomake-c538dc193d39be7df03615d4d4792ec4c1aedf97.tar.gz
Added support for Conditional statement and Test files.
* automake.y : Updated to handle conditional statement and empty variable * defination * parser.pl : Updated to read from standard input and write to standard * output. In debug mode, output on standard error stream. * Converter.pl : Updated to handle empty grammar definitions. * Tree.pm : Updated to handle conditional statements and write output to * standard output * Makefile : Added action test. * test.sh : Read all text files in t directory and generates corresponding * standard output * Makefile : Added action test. * t/*.txt : test files.
-rw-r--r--lib/Automake/Parser/.gitignore1
-rw-r--r--lib/Automake/Parser/Converter.pl14
-rw-r--r--lib/Automake/Parser/Lexer.pm37
-rw-r--r--lib/Automake/Parser/Makefile19
-rw-r--r--lib/Automake/Parser/ParserTable.pm50
-rw-r--r--lib/Automake/Parser/Tree.pm200
-rw-r--r--lib/Automake/Parser/automake.y28
-rw-r--r--lib/Automake/Parser/input.txt15
-rw-r--r--lib/Automake/Parser/parser.pl29
-rw-r--r--lib/Automake/Parser/t/.gitignore1
-rw-r--r--lib/Automake/Parser/t/automakecomment.txt4
-rw-r--r--lib/Automake/Parser/t/conditional.txt6
-rw-r--r--lib/Automake/Parser/t/multiline.txt4
-rw-r--r--lib/Automake/Parser/t/multilinecoment.txt7
-rw-r--r--lib/Automake/Parser/t/primaries.txt3
-rw-r--r--lib/Automake/Parser/test.sh23
16 files changed, 312 insertions, 129 deletions
diff --git a/lib/Automake/Parser/.gitignore b/lib/Automake/Parser/.gitignore
index fa83ea497..db764bc80 100644
--- a/lib/Automake/Parser/.gitignore
+++ b/lib/Automake/Parser/.gitignore
@@ -2,3 +2,4 @@
*.png
*.dot
*.tab.c
+*.output
diff --git a/lib/Automake/Parser/Converter.pl b/lib/Automake/Parser/Converter.pl
index ab2184486..a4419a08d 100644
--- a/lib/Automake/Parser/Converter.pl
+++ b/lib/Automake/Parser/Converter.pl
@@ -1,6 +1,16 @@
#!/usr/bin/perl
use strict;
+my %hashx;
+
+while ( <> )
+{
+ last if m/^Terminals, with /o;
+ $hashx{$1}=$2 if m/^\s+(\d+) (.*?): %empty\n/;
+}
+
+close ARGV;
+
#Stores the parser table. Its an array of hashes. Each index corresponds
#to ith state. Every key in hash corresponds to a token, value corresponds
#to next state. reduce key specifies the reduction of token and its
@@ -62,6 +72,10 @@ while( <> )
$table[ $state_number ] = {};
$acceptstate = $state_number;
}
+ elsif($1 eq $1+0)
+ {
+ $table[$state_number]{reduce}=[0," \\&$hashx{$production_number}"];
+ }
else
{
$table[ $state_number ]{ reduce } = [scalar( split( /\s+/ , $2 )) , " \\&$1" ];
diff --git a/lib/Automake/Parser/Lexer.pm b/lib/Automake/Parser/Lexer.pm
index 7446e8114..d4190eedd 100644
--- a/lib/Automake/Parser/Lexer.pm
+++ b/lib/Automake/Parser/Lexer.pm
@@ -39,10 +39,7 @@ sub lex($$)
{
if($val =~ m/^##/)
{
- if($vals[ -1 ] eq '\\')
- {
- $multiline = 'automake_comment';
- }
+ $multiline = 'automake_comment' if $vals[ -1 ] eq '\\';
$_ = undef;
last;
}
@@ -55,10 +52,7 @@ sub lex($$)
$comment .= " ".$val;
}
}
- if( $comment )
- {
- push @tokens, [ "comment" , $comment ];
- }
+ push @tokens, [ "comment" , $comment ] if $comment;
if($vals[ -1 ] ne '\\')
{
$multiline = undef;
@@ -80,27 +74,18 @@ sub lex($$)
{
if( $val =~ m/^##/ )
{
- if($vals[ -1 ] eq '\\' )
- {
- $multiline = 'automake_comment';
- }
+ $multiline = 'automake_comment' if $vals[ -1 ] eq '\\';
$_ = undef;
last;
}
elsif( $val =~ m/^#(.*)/ )
{
- if($vals[ -1 ] eq '\\' )
- {
- $multiline = 'comment';
- }
+ $multiline = 'comment' if $vals[ -1 ] eq '\\';
$comment .= " ".$1;
}
elsif( $val =~ m/\\/ )
{
- if( !$multiline )
- {
- $multiline = 'rhsval';
- }
+ $multiline = 'rhsval' if !$multiline;
}
elsif( $comment )
{
@@ -111,14 +96,8 @@ sub lex($$)
push @tokens, [ "rhsval" , $val];
}
}
- if( $comment )
- {
- push @tokens, [ "comment" , $comment];
- }
- if( !$multiline )
- {
- push @tokens, [ "newline" ];
- }
+ push @tokens, [ "comment" , $comment] if $comment;
+ push @tokens, [ "newline" ] if !$multiline;
$_ = undef;
}
elsif( s/^##.*\n$//o )
@@ -138,7 +117,7 @@ sub lex($$)
push @tokens, [ "newline" ];
}
}
- elsif( s/^(PROGRAMS|LIBRARIES|LTLIBRARIES|LISP|PYTHON|JAVA|SCRIPTS|DATA|HEADERS|MASN|TEXINFOS)//o)
+ elsif( s/^(PROGRAMS|LIBRARIES|LTLIBRARIES|LISP|PYTHON|JAVA|SCRIPTS|DATA|HEADERS|MASN|TEXINFOS|if|else|endif)//o)
{
push @tokens, [$1];
}
diff --git a/lib/Automake/Parser/Makefile b/lib/Automake/Parser/Makefile
index 9e1c41322..84c1ca9e2 100644
--- a/lib/Automake/Parser/Makefile
+++ b/lib/Automake/Parser/Makefile
@@ -2,12 +2,12 @@
all: ast.png
ast.png: Lexer.pm Tree.pm ParserTable.pm parser.pl input.txt
- perl -I. parser.pl
+ perl -I. parser.pl input.txt > ast.gv
unflatten -f -l 10 -c 10 -o ast1.gv ast.gv
dot -Tpng ast1.gv > ast.png
- rm ast1.gv
-
-build: automake.dot ParserTable.pm
+ rm ast.gv ast1.gv
+
+build: ParserTable.pm
automake.dot: automake.y
bison --graph automake.y
@@ -15,6 +15,13 @@ automake.dot: automake.y
unflatten -f -l 16 -c 9 -o automake1.dot automake.dot
dot -Tpng automake1.dot > automake.png
rm automake1.dot
+
+automake.output: automake.y
+ bison --report=all automake.y
+ rm automake.tab.c
+
+ParserTable.pm: automake.dot automake.output Converter.pl
+ perl -I. Converter.pl automake.output automake.dot > ParserTable.pm
-ParserTable.pm: automake.dot Converter.pl
- perl -I. Converter.pl < automake.dot > ParserTable.pm
+test:
+ sh test.sh
diff --git a/lib/Automake/Parser/ParserTable.pm b/lib/Automake/Parser/ParserTable.pm
index d215a0a7d..907a9a9ef 100644
--- a/lib/Automake/Parser/ParserTable.pm
+++ b/lib/Automake/Parser/ParserTable.pm
@@ -6,26 +6,34 @@ use Tree;
our @ISA=qw(Exporter);
our @Export=qw(@table $accept);
-our $accept=11;
+our $accept=17;
our @table=(
- {commentlist => 7, optionlist => 8, stmts => 4, comment => 2, value => 1, stmt => 5, lhs => 6, input => 3},
- {'_' => 10, ':' => 9},
+ {commentlist => 12, if => 3, lhs => 11, value => 1, makerule => 8, optionlist => 13, comment => 2, input => 4, automakerule => 7, stmt => 6, stmts => 5, conditional => 9, ifblock => 10},
+ {reduce => [1, \&lhs], ':' => 14, '_' => 15},
{reduce => [1, \&commentlist]},
- {end => 11},
- {lhs => 6, reduce => [1, \&input], comment => 2, commentlist => 7, value => 1, optionlist => 8, stmt => 12},
- {newline => 13},
- {'=' => 14},
- {reduce => [1, \&stmt], comment => 15},
- {PYTHON => 21, HEADERS => 25, JAVA => 22, LTLIBRARIES => 19, PROGRAMS => 17, primaries => 28, MASN => 26, value => 16, SCRIPTS => 23, LISP => 20, DATA => 24, LIBRARIES => 18, TEXINFOS => 27},
- {rhs => 30, rhsval => 29},
+ {value => 16},
+ {end => 17},
+ {value => 1, lhs => 11, if => 3, commentlist => 12, automakerule => 7, comment => 2, optionlist => 13, makerule => 8, reduce => [1, \&input], stmt => 18, ifblock => 10, conditional => 9},
+ {newline => 19},
+ {reduce => [1, \&stmt]},
+ {reduce => [1, \&stmt]},
+ {reduce => [1, \&stmt]},
+ {optionalelse => 21, reduce => [0, \&optionalelse], else => 20},
+ {'=' => 22},
+ {comment => 23, reduce => [1, \&stmt]},
+ {JAVA => 30, PROGRAMS => 25, TEXINFOS => 35, DATA => 32, primaries => 36, HEADERS => 33, LTLIBRARIES => 27, LISP => 28, PYTHON => 29, SCRIPTS => 31, value => 24, MASN => 34, LIBRARIES => 26},
+ {rhs => 38, rhsval => 37},
{reduce => [2, \&optionlist]},
+ {newline => 39},
{},
- {newline => 31},
+ {newline => 40},
{reduce => [2, \&stmts]},
- {rhsval => 29, rhs => 32},
+ {newline => 41},
+ {endif => 42},
+ {rhsval => 37, rhs => 44, optionalrhs => 43, reduce => [0, \&optionalrhs]},
{reduce => [2, \&commentlist]},
- {reduce => [1, \&primaries], '_' => 33},
+ {'_' => 45, reduce => [1, \&primaries]},
{reduce => [1, \&primaries]},
{reduce => [1, \&primaries]},
{reduce => [1, \&primaries]},
@@ -39,10 +47,20 @@ our @table=(
{reduce => [1, \&primaries]},
{reduce => [2, \&lhs]},
{reduce => [1, \&rhs]},
- {reduce => [3, \&stmt], rhsval => 34},
+ {reduce => [3, \&makerule], rhsval => 46},
+ {automakerule => 48, optionlist => 13, lhs => 11, value => 47},
{reduce => [3, \&stmts]},
- {commentlist => 35, reduce => [3, \&stmt], comment => 2, rhsval => 34},
+ {lhs => 11, value => 47, automakerule => 49, optionlist => 13},
+ {reduce => [3, \&conditional]},
+ {optionalcomments => 50, comment => 2, commentlist => 51, reduce => [0, \&optionalcomments]},
+ {reduce => [1, \&optionalrhs], rhsval => 46},
{reduce => [3, \&optionlist]},
{reduce => [2, \&rhs]},
- {reduce => [4, \&stmt], comment => 15}
+ {reduce => [1, \&lhs], '_' => 15},
+ {newline => 52},
+ {newline => 53},
+ {reduce => [4, \&automakerule]},
+ {comment => 23, reduce => [1, \&optionalcomments]},
+ {reduce => [5, \&ifblock]},
+ {reduce => [4, \&optionalelse]}
); \ No newline at end of file
diff --git a/lib/Automake/Parser/Tree.pm b/lib/Automake/Parser/Tree.pm
index 92aa7673a..6e7a4079c 100644
--- a/lib/Automake/Parser/Tree.pm
+++ b/lib/Automake/Parser/Tree.pm
@@ -3,7 +3,9 @@ package Tree;
use Exporter;
our @ISA = qw(Exporter);
-our @EXPORT = qw(input stmt stmts lhs rhs primaries optionlist commentlist traverse printgraph);
+our @EXPORT = qw(input stmts stmt automakerule makerule conditional ifblock
+optionalelse optionalrhs optionalcomments lhs rhs commentlist primaries
+optionlist traverse printgraph);
# Grammar Rule : (1) input => stmts
# Create a node having child as stmts.
@@ -14,66 +16,151 @@ sub input($)
return \%node;
}
-# Grammar Rule : (1) stmt => lhs '=' rhs
-# Create a node for Automake rule having lhs and rhs as its childs.
-# (2) stmt => lhs '=' rhs commentlist
-# Create a node for Automake rule having lhs, rhs and comments as its child.
-# (3) stmt => value ':' rhs
-# Create a node for Make rule having lhs and rhs as its childs.
-# (4) stmt => commentlist
-# Create a node for comments.
-sub stmt($;$$;$)
+# Grammar Rule : (1) stmts=> stmt '\n'
+# Creates a node having a child as stmt
+# (2) stmts=> stmts stmt '\n'
+# Creates a node having a child as stmt. Insert the created node into
+# the childs array of the stmts(First Argument).
+sub stmts($$;$)
+{
+ my ( $val1, $val2, $val3) = @_;
+ if($val3 == undef)
+ {
+ my %node=(name=>stmts,childs=>[$val1]);
+ return \%node;
+ }
+ else
+ {
+ push @{$val1->{childs}},$val2;
+ return $val1;
+ }
+}
+
+
+# Grammar Rule : (1) stmt => automakerule
+# (2) stmt => makerule
+# (3) stmt => commentlist
+# (4) stmt => conditional
+# Create a node with corresponding child node.
+sub stmt($)
+{
+ my ( $val1) = @_;
+ my %node = ( name => stmt , childs => [ $val1 ]);
+ return \%node;
+}
+
+# Grammar Rule : (1) automakerule => lhs '=' optionalrhs optionalcomments
+# Create a node for automake rule.
+sub automakerule($$$$)
{
my ( $val1, $val2, $val3, $val4 ) = @_;
- my %node;
- if( !$val2 )
+ my %node = (name => automakerule, childs => [ $val1,$val3 ]);
+ push @{ $node{ childs }}, $val4 if $val4;
+ return \%node;
+}
+
+# Grammar Rule : (1) makerule => value ':' rhs
+# Create a node for make rule.
+sub makerule($$$)
+{
+ my ( $val1, $val2, $val3 ) = @_;
+ my %node = (name => makerule, childs => [ $val1,$val3 ]);
+ return \%node;
+}
+
+# Grammar Rule : (1) optionalrhs =>
+# Create an empty node.
+# (2) optionalrhs => rhs
+# Create a node with rhs as child.
+sub optionalrhs(;$)
+{
+ my ( $val ) = @_;
+ my %node = ( name => optionalrhs );
+ if( $val == undef )
{
- %node = (name => stmt, childs => [ $val1 ], type => comment);
+ $node{ empty } = 1;
}
- elsif( $val2 -> [0] eq '=' )
+ else
{
- %node = (name => stmt, childs => [ $val1,$val3 ],type => automake);
- if( $val4 )
- {
- push @{ $node{ childs }}, $val4;
- }
+ $node{ childs } = [ $val ];
+ }
+ return \%node;
+}
+
+# Grammar Rule : (1) optionalcomments =>
+# Create an empty node.
+# (2) optionalcomments => commentlist
+# Create a node with commentlist as child.
+sub optionalcomments(;$)
+{
+ my ( $val ) = @_;
+ my %node = ( name => optionalcomments );
+ if( $val == undef )
+ {
+ $node{ empty } = 1;
}
else
{
- %node = (name => stmt, childs => [ $val1,$val3 ],type => make);
- }
+ $node{ childs } = [ $val ];
+ }
return \%node;
}
-# Grammar Rule : (1) stmts=> stmt '\n'
-# Creates a node having a child as stmt
-# (2) stmts=> stmts stmt '\n'
-# Creates a node having a child as stmt. Insert the created node into
-# the childs array of the stmts(First Argument).
-sub stmts($$;$)
+# Grammar Rule : (1) conditional => ifblock optionalelse endif
+# Create a node for conditional statement.
+sub conditional($$$)
{
- my ( $val1, $val2, $val3) = @_;
- if($val3 == undef)
+ my ( $val1, $val2, $val3 ) = @_;
+ my %node = ( name => conditional, childs => [ $val1, $val2]);
+ return \%node;
+}
+
+# Grammar Rule : (1) ifblock => if value newline automakerule newline
+# Create a node for if block.
+sub ifblock($$$$$)
+{
+ my ( $val1, $val2, $val3, $val4, $val5) = @_;
+ my %node = ( name => ifblock, condition => $val2 -> [1], childs => [$val4]);
+ return \%node;
+}
+
+# Grammar Rule : (1) optionalelse =>
+# Create an empty node.
+# (2) optionalelse => else newline automakerule newline
+# Create a node with child as automakerule.
+sub optionalelse(;$$$$)
+{
+ my ( $val1, $val2, $val3, $val4 ) = @_;
+ my %node = ( name => optionalelse );
+ if( $val1 == undef )
{
- my %node = (name => stmts, childs => [ $val1 ]);
- my %nodeval = (name => stmts, childs => [ \%node ]);
- return \%nodeval;
+ $node{ empty } = 1;
}
else
{
- my %node = (name => stmts,childs => [ $val2 ]);
- push @{ $val1 -> { childs }}, \%node;
- return $val1;
+ $node{ childs } = [ $val3 ];
}
+ return \%node;
}
# Grammar Rule : (1) lhs => optionlist primaries
# Create a node for left hand side of variable defination consisting of
# option list and primary.
-sub lhs($$)
+# (2) lhs => value
+# Create a node for left hand side of variable defination having a simple
+# variable defination.
+sub lhs($;$)
{
my ( $val1, $val2 ) = @_;
- my %node = (name => lhs, childs => [ $val1, $val2 ]);
+ my %node = ( name => lhs);
+ if( $val2 == undef )
+ {
+ $node{ value } = $val1 -> [1];
+ }
+ else
+ {
+ $node{ childs } = [ $val1, $val2 ];
+ }
return \%node;
}
@@ -103,7 +190,7 @@ sub rhs($;$)
sub commentlist($;$)
{
my ( $val1, $val2 ) = @_;
- if($val2 == undef)
+ if( $val2 == undef )
{
my %node = ( name => commentlist, value => [ $val1 -> [1]]);
return \%node;
@@ -131,14 +218,14 @@ sub commentlist($;$)
sub primaries($)
{
my ( $val ) = @_;
- my %node;
+ my %node = ( name => primaries );
if( $val -> [0] eq 'value')
{
- %node = ( name => primaries, val=> $val -> [1]);
+ $node{value}= $val -> [1];
}
else
{
- %node = ( name => primaries, val => $val);
+ $node{value}= $val;
}
return \%node;
}
@@ -163,32 +250,29 @@ sub optionlist($$;$)
}
# printgraph(Hash)
-# prints the AST by traversing the tree starting at node pointed by hash.
+# prints the AST to Standard Output by traversing the tree starting at node pointed by hash.
sub printgraph($)
{
- my $FH;
- open( $FH, '>', 'ast.gv' ) or die $!;
- print $FH "graph graphname {\n";
+ print "graph graphname {\n";
my ( $ref ) = @_;
- print $FH "0 [label=\"Root\"];";
- traverse( $ref, $FH, 0);
- print $FH "}\n";
- close $FH;
+ print "0 [label=\"Root\"];";
+ traverse( $ref, 0);
+ print "}\n";
}
#Stores the next id to be alloted to new node.
my $id=0;
-# traverse(Hash, File Handle, Parent Id)
-# Traverses the tree recursively. Prints the information about the current
-# node to file. Call all its child with Parent Id equal to current Node Id.
-sub traverse($$$)
+# traverse(Hash, Parent Id)
+# Traverses the tree recursively. Prints the information about the current node to Standard Output. Call all its child with Parent Id equal to current Node Id.
+sub traverse($$)
{
- my ( $ref,$FH,$parent ) = @_;
+ my ( $ref,$parent ) = @_;
+ my %node = %$ref;
+ return if $node{empty};
$id++;
my $curr_id = $id;
- my %node = %$ref;
- print $FH "$parent--$id;\n";
+ print "$parent--$id;\n";
my $label = "";
@keys = sort grep {!/^childs/} keys %node;
foreach $key ( @keys )
@@ -203,13 +287,13 @@ sub traverse($$$)
$label .= $node{$key}." ";
}
}
- print $FH "$curr_id [label=\"$label\"];";
+ print "$curr_id [label=\"$label\"];";
if( $node{childs} )
{
my $val1 = $node{childs};
foreach $child (@$val1)
{
- traverse($child,$FH,$curr_id);
+ traverse($child,$curr_id);
}
}
}
diff --git a/lib/Automake/Parser/automake.y b/lib/Automake/Parser/automake.y
index 45fdc1598..41f0e6aa6 100644
--- a/lib/Automake/Parser/automake.y
+++ b/lib/Automake/Parser/automake.y
@@ -1,4 +1,4 @@
-%token value rhsval comment PROGRAMS LIBRARIES LTLIBRARIES LISP PYTHON JAVA SCRIPTS DATA HEADERS MASN TEXINFOS newline
+%token value rhsval comment PROGRAMS LIBRARIES LTLIBRARIES LISP PYTHON JAVA SCRIPTS DATA HEADERS MASN TEXINFOS newline if else endif
%%
input : stmts
@@ -6,12 +6,30 @@ input : stmts
stmts : stmt newline
| stmts stmt newline
;
-stmt : lhs '=' rhs
- | lhs '=' rhs commentlist
- | value ':' rhs
+stmt : automakerule
+ | makerule
| commentlist
-;
+ | conditional
+;
+automakerule : lhs '=' optionalrhs optionalcomments
+;
+makerule : value ':' rhs
+;
+conditional : ifblock optionalelse endif
+;
+ifblock : if value newline automakerule newline
+;
+optionalelse:
+ | else newline automakerule newline
+;
+optionalrhs :
+ | rhs
+;
+optionalcomments :
+ | commentlist
+;
lhs : optionlist primaries
+ | value
;
rhs : rhsval
| rhs rhsval
diff --git a/lib/Automake/Parser/input.txt b/lib/Automake/Parser/input.txt
index fe3ca91ea..b09e7ef8c 100644
--- a/lib/Automake/Parser/input.txt
+++ b/lib/Automake/Parser/input.txt
@@ -3,11 +3,18 @@ dist_bin_PROGRAMS = server \
client
server_SOURCES = server.c db.c ## Server Files \
Database Files
-#Comment Testing Here \
-Same here
-client_SOURCES = client.c dep.c #Multiline comment \
+#Comment Testing Here
+#a
+#b
+#c
+#END
+client_SOURCES = #Multiline comment \
Client dependencies
-noinst_LIBRARIES = libfoo.a
+if installed
+noinst_LIBRARIES = foolib.b
+else
+noinst_LIBRARIES =
+endif
noinst_LTLIBRARIES = foolib.a
files_JAVA = a.java b.java
files_PYTHON = chk.py app.py test.py
diff --git a/lib/Automake/Parser/parser.pl b/lib/Automake/Parser/parser.pl
index 4a3386d14..64cace1d1 100644
--- a/lib/Automake/Parser/parser.pl
+++ b/lib/Automake/Parser/parser.pl
@@ -6,37 +6,44 @@ use ParserTable;
my $debug = 0;
-#Input file for conversion
-my $data;
-open ( $data, "<input.txt" );
-
#Stores the list of tokens generated by lexer.
my @tokens;
my $multiline = 0;
my $curr_tokens;
-while ( <$data> )
+
+#Read input from file specified in Arguements or STDIN.
+while ( <> )
{
- ( $curr_tokens, $multiline) = lex($_ , $multiline);
+ ( $curr_tokens, $multiline ) = lex($_ , $multiline);
push @tokens,@$curr_tokens;
}
+
+#Prints to STDERR if Debug mode is on.
if( $debug )
{
- print "Lexer Output\n";
+ print STDERR "Lexer Output\n";
foreach my $token ( @tokens )
{
- print join(" ", @{$token}), "\n";
+ print STDERR join(" ", @{$token}), "\n";
}
}
+
+#Push a newline token if last token is not newline
+if( $tokens[-1][0] ne "newline" )
+{
+ push @tokens,["newline"];
+}
+
push @tokens, [ "end" ];
my @stack = (0);
-print "Parser Output\n" if $debug;
+print STDERR "Parser Output\n" if $debug;
while ( @stack )
{
if($stack[-1] == $ParserTable::accept)
{
- print "Complete\n";
+ print STDERR "Complete\n";
printgraph( $stack[-4] );
last;
}
@@ -70,5 +77,5 @@ while ( @stack )
{
die "Unexpected Token ". @curr_token."\n";
}
- print @stack, "\n" if $debug;
+ print STDERR @stack, "\n" if $debug;
} \ No newline at end of file
diff --git a/lib/Automake/Parser/t/.gitignore b/lib/Automake/Parser/t/.gitignore
new file mode 100644
index 000000000..aab52d906
--- /dev/null
+++ b/lib/Automake/Parser/t/.gitignore
@@ -0,0 +1 @@
+*.png \ No newline at end of file
diff --git a/lib/Automake/Parser/t/automakecomment.txt b/lib/Automake/Parser/t/automakecomment.txt
new file mode 100644
index 000000000..330e77227
--- /dev/null
+++ b/lib/Automake/Parser/t/automakecomment.txt
@@ -0,0 +1,4 @@
+## Process this file with automake to produce Makefile.in
+bin_PROGRAMS = ball
+ball_SOURCES = ball.c ## C file
+##End of File
diff --git a/lib/Automake/Parser/t/conditional.txt b/lib/Automake/Parser/t/conditional.txt
new file mode 100644
index 000000000..3708d8093
--- /dev/null
+++ b/lib/Automake/Parser/t/conditional.txt
@@ -0,0 +1,6 @@
+bin_PROGRAMS = server
+if windows
+server_SOURCES = winserver.c
+else
+server_SOURCES = unixserver.c
+endif \ No newline at end of file
diff --git a/lib/Automake/Parser/t/multiline.txt b/lib/Automake/Parser/t/multiline.txt
new file mode 100644
index 000000000..da5cfe84f
--- /dev/null
+++ b/lib/Automake/Parser/t/multiline.txt
@@ -0,0 +1,4 @@
+bin_PROGRAMS = apple \
+ball
+apple_SOURCES = apple.c
+ball_SOURCES = ball.c \ No newline at end of file
diff --git a/lib/Automake/Parser/t/multilinecoment.txt b/lib/Automake/Parser/t/multilinecoment.txt
new file mode 100644
index 000000000..9788fbe62
--- /dev/null
+++ b/lib/Automake/Parser/t/multilinecoment.txt
@@ -0,0 +1,7 @@
+bin_PROGRAMS = apple \
+ball
+apple_SOURCES = apple.c ## Comment on \
+Multiple line
+ball_SOURCES = # No file \
+Multiple line1 \
+Multiple line2
diff --git a/lib/Automake/Parser/t/primaries.txt b/lib/Automake/Parser/t/primaries.txt
new file mode 100644
index 000000000..6de44787e
--- /dev/null
+++ b/lib/Automake/Parser/t/primaries.txt
@@ -0,0 +1,3 @@
+dist_bin_PROGRAMS = server client
+server_SOURCES = server.c db.c
+client_SOURCES = client.c \ No newline at end of file
diff --git a/lib/Automake/Parser/test.sh b/lib/Automake/Parser/test.sh
new file mode 100644
index 000000000..f20e0097b
--- /dev/null
+++ b/lib/Automake/Parser/test.sh
@@ -0,0 +1,23 @@
+
+testfile()
+{
+ filename=$1
+ echo $filename
+ perl -I. parser.pl $filename > $filename.gv
+ unflatten -f -l 10 -c 10 -o $filename1.gv $filename.gv
+ dot -Tpng $filename1.gv > $filename.png
+ rm $filename.gv $filename1.gv
+}
+
+if [ $# -eq 0 ]
+then
+ for entry in t/*.txt
+ do
+ testfile $entry
+ done
+else
+ for entry in $@
+ do
+ testfile $entry
+ done
+fi