#include "model/nonterminal_rules/[[[$nonterminal]]].h" #include [[[ my %rules; foreach my $production (@productions) { foreach my $rule (@{$production->{'rules'}}) { $rules{$rule} = 1; } } # Sort so that output files can more easily be compared foreach my $rule (sort keys %rules) { next if $rule eq $nonterminal; if (grep { $_ eq $rule } @{$grammar->{'TERMINALS'}}) { $OUT .= qq{#include "model/terminal_rules/$rule.h"\n}; } else { $OUT .= qq{#include "model/nonterminal_rules/$rule.h"\n}; } } ]]] #include using namespace std; [[[ foreach my $i (1..$#productions+1) { $OUT .=<='; my ($number) = $productions[$i-1]{'length constraint'} =~ /(\d+)/; $OUT .=<<"EOF"; #ifndef DISABLE_PRODUCTION_LENGTH_OPTIMIZATION if (in_allowed_length $operator $number) #endif // DISABLE_PRODUCTION_LENGTH_OPTIMIZATION { if (m_$i == NULL) m_$i = new match_$i; m_rule_lists.push_back(m_$i); } EOF } $OUT .= "\n Nonterminal_Rule::Initialize(in_allowed_length, in_previous_rule);\n"; $OUT .= "}\n"; if (defined $return_type) { $OUT .=<(*m_current_rule_list)) return the_rule_list->Get_Value(); EOF } $OUT .= " assert(false);\n\n"; if (defined $nonpointer_return_type) { $OUT .= " return new $nonpointer_return_type();\n"; } else { $OUT .= " return $return_type();\n"; } $OUT .= "}\n"; } chomp $OUT; ]]]