2 # Altera PTF file parser
4 # Copyright (c) 2004 Microtronix Datacom Ltd.
14 section: section_title '{' section_element '}' {
15 my $sectionStack = $_[0]->YYData->{sectionStack};
20 section_title: IDENTIFIER section_name {
21 my $section = PTFSection->new (type => $_[1], name => $_[2]);
22 my $sectionStack = $_[0]->YYData->{sectionStack};
24 if (scalar(@{$sectionStack}) == 0) {
25 $_[0]->YYData->{root} = $section;
27 my $parent = $sectionStack->[$#{$sectionStack}];
28 $parent->addSection ($section);
31 push @{$sectionStack}, $section;
35 section_name: # empty string
41 section_element: # empty element
42 | assignment section_element
43 | section section_element
46 assignment: assignment_name '=' assignment_value ';' {
47 my $sectionStack = $_[0]->YYData->{sectionStack};
48 my $parent= $sectionStack->[$#{$sectionStack}];
49 $parent->addAssignment ($_[1], $_[3]);
53 assignment_name: IDENTIFIER
57 assignment_value: STRING_LITERAL
64 # TODO: update this error function to be more useful
65 exists $_[0]->YYData->{ERRMSG}
67 print $_[0]->YYData->{ERRMSG};
68 delete $_[0]->YYData->{ERRMSG};
71 print "Syntax error on line $_[0]->YYData->{line}.\n";
77 if (! $parser->YYData->{INPUT}) {
78 if ($parser->YYData->{INPUT} = <PTFFILE>) {
79 $parser->YYData->{line} += 1;
85 $parser->YYData->{INPUT} and
86 $parser->YYData->{INPUT} =~ s/^\s*//;
91 if ($parser->YYData->{INPUT} =~ s/^[ \t\r\n]*$//) {
92 if ($parser->YYData->{INPUT} = <PTFFILE>) {
93 $parser->YYData->{line} += 1;
97 $parser->YYData->{INPUT} and
98 $parser->YYData->{INPUT} =~ s/^\s*//;
103 if ($parser->YYData->{INPUT} =~ s/^#.*//) {
104 if ($parser->YYData->{INPUT} = <PTFFILE>) {
105 $parser->YYData->{line} += 1;
109 $parser->YYData->{INPUT} and
110 $parser->YYData->{INPUT} =~ s/^\s*//;
114 # Don't continue if the line length is 0;
115 if (length $parser->YYData->{INPUT} == 0) {
116 if ($parser->YYData->{INPUT} = <PTFFILE>) {
117 $parser->YYData->{line} += 1;
121 $parser->YYData->{INPUT} and
122 $parser->YYData->{INPUT} =~ s/^\s*//;
127 $parser->YYData->{INPUT} =~ s/^([a-zA-Z_][a-zA-Z_0-9\/]*)//
128 and return('IDENTIFIER',$1);
129 $parser->YYData->{INPUT} =~ s/^"([^"\\]*(\\.[^"\\]*)*)"//
130 and return('STRING_LITERAL',$1);
131 $parser->YYData->{INPUT} =~ s/^"([^"\\]*(\\.[^"\\]*)*)//
136 if ($parser->YYData->{INPUT} = <PTFFILE>) {
137 $parser->YYData->{line} += 1;
142 $parser->YYData->{INPUT} =~ s/([^"\\]*(\\.[^"\\]*)*)"//
145 return ('STRING_LITERAL', $literal);
148 $parser->YYData->{INPUT} =~ s/([^"\\]*(\\.[^"\\]*)*)//
152 $parser->YYData->{INPUT} =~ s/^([0-9]+)//
153 and return('NUMBER',$1);
154 $parser->YYData->{INPUT} =~ s/^([\$]{1,2}[a-zA-Z0-9 \/_]+)//
155 and return('HIERARCHICAL_NAME',$1);
156 $parser->YYData->{INPUT} =~ s/^(.)//
163 my $filename = shift;
165 # store information for later use
166 $self->YYData->{line} = 0;
167 $self->YYData->{sectionStack} = [];
168 undef $self->YYData->{root};
170 open (PTFFILE, $filename) or return undef;
177 return $self->YYData->{root};