File Coverage

blib/lib/MarpaX/G4.pm
Criterion Covered Total %
statement 49 82 59.7
branch 15 42 35.7
condition 2 8 25.0
subroutine 9 12 75.0
pod 0 6 0.0
total 75 150 50.0


line stmt bran cond sub pod time code
1             # ----------------------------------------------------------------------------------------------------- #
2             # MarpaX::MarpaGen #
3             # #
4             # translate the parsed antlr4 rules to Marpa::R2 syntax. #
5             # #
6             # V 0.9.6 #
7             # ----------------------------------------------------------------------------------------------------- #
8              
9             package MarpaX::G4;
10              
11 2     2   842 use strict;
  2         4  
  2         51  
12 2     2   8 use warnings FATAL => 'all';
  2         2  
  2         62  
13              
14 2     2   876 use Data::Dumper;
  2         10595  
  2         127  
15              
16 2     2   838 use MarpaX::G4::Parser;
  2         7  
  2         100  
17 2     2   933 use MarpaX::G4::Symboltable;
  2         4  
  2         55  
18 2     2   1374 use MarpaX::G4::MarpaGen;
  2         5  
  2         1245  
19              
20             our $VERSION = '1.0.0';
21             our $optstr = 'cdefghiko:prs:tuv';
22              
23             sub new
24             {
25 1     1 0 1088 my $invocant = shift;
26 1   33     6 my $class = ref($invocant) || $invocant; # Object or class name
27 1         1 my $self = {}; # initiate our handy hashref
28 1         2 bless($self,$class); # make it usable
29              
30 1         2 return $self;
31             }
32              
33             sub printHelpScreen
34             {
35 0     0 0 0 my ($scriptName) = @_;
36              
37 0         0 my $usage = "Usage: $scriptName [-cdefghikprtuv] [-s ] [-o ] [ ...]";
38              
39 0         0 my @helptext = (
40             "$scriptName - Antlr4 to MarpaX converter"
41             ,""
42             ,"$usage"
43             ,""
44             ,"-c strip all comments and actions (except inline actions)"
45             ,"-d dump the parse tree"
46             ,"-e embed the g4 inline actions into the marpa grammar"
47             ," (default : prefix as comments ahead of the rule)"
48             ,"-f convert fragments to classes where applicable"
49             ,"-g convert lazy to greedy quantifiers"
50             ," (CAVEAT: this might change the grammar semantics)"
51             ,"-h print this help and exit"
52             ,"-i ignore redirects (don't discard redirected rules)"
53             ,"-k build case-insensitive keywords from single-letter fragments"
54             ,"-o specify the output file. default is stdout"
55             ,"-p strip inline comments and actions"
56             ,"-r verify the consistency of the symbol table"
57             ,"-s specify the start rule of the grammar"
58             ," (default: 1st rule of the 1st input file)"
59             ,"-t trace the grammar generation"
60             ,"-u make literals and classes case-insensitive"
61             ,"-v dump the symbol table"
62             );
63              
64 0         0 map { print $_ . "\n"; } @helptext;
  0         0  
65              
66 0         0 exit 0;
67             }
68              
69             ##
70             # readFile: swallow an entire input file into a string
71             ##
72             sub readFile
73             {
74 0     0 0 0 my ($infile) = @_;
75              
76 0 0       0 my $inph = *STDIN if $infile eq '-';
77 0 0 0     0 open($inph, "< $infile") || die "can't open input file $infile : $!" if $infile ne '-';
78              
79             my $file_text = do
80 0         0 {
81 0         0 local $/;
82 0         0 <$inph>;
83             };
84              
85 0 0       0 close($inph) if $infile ne '-';
86              
87 0         0 return $file_text;
88             }
89              
90             ##
91             # processSymboltable: generate the output grammar from the symbol table
92             ##
93             sub processSymboltable
94             {
95 1     1 0 4 my ($self, $symboltable, $options ) = @_;
96              
97 1 50       4 if ( exists $options->{v} )
98             {
99 0         0 $Data::Dumper::Indent = 1;
100 0         0 print Dumper($symboltable);
101             }
102              
103 1 50       5 $symboltable->setStartRule($options->{s}) if exists $options->{s};
104 1 50       4 $symboltable->validateSymbolTable() if exists $options->{r};
105              
106 1         12 my $generator = new MarpaX::G4::MarpaGen;
107              
108 1 50       4 $generator->stripallcomments if exists $options->{c};
109 1 50       3 $generator->embedactions if exists $options->{e};
110 1 50       7 $generator->fragment2class if exists $options->{f};
111 1 50       3 $generator->shiftlazytogreedy if exists $options->{g};
112 1 50       8 $generator->buildkeywords if exists $options->{k};
113 1 50       3 $generator->stripactions if exists $options->{p};
114 1 50       3 $generator->setVerbosity(2) if exists $options->{t};
115 1 50 33     8 $generator->matchcaseinsensitive if exists $options->{u} || exists $options->{k};
116              
117 1         2 my $outputfile = '-';
118 1 50       3 $outputfile = $options->{o} if exists $options->{o};
119 1         6 $generator->setoutputfile($outputfile);
120              
121 1         4 $generator->generate($symboltable);
122             }
123              
124             ##
125             # translatestring: parse the antlr4 input grammar from '$grammartext',
126             # generate the Marpa::R2 output grammar.
127             ##
128             sub translatestring
129             {
130 1     1 0 14 my ( $self, $grammartext, $options ) = @_;
131              
132 1         6 my $parser = new MarpaX::G4::Parser;
133 1 50       6 $parser->enabletrace if exists $options->{t};
134 1 50       4 $parser->ignoreredirect if exists $options->{i};
135              
136 1         12 my $symboltable = new MarpaX::G4::Symboltable;
137              
138 1         6 my $data = $parser->parse($grammartext);
139 1 50       7 if ( exists $options->{d} )
140             {
141 0         0 printf "===\n=== Parsed Hashtable\n===\n";
142 0         0 $Data::Dumper::Indent = 2;
143 0         0 print Dumper($data);
144             }
145 1         7 $symboltable->importParseTree($data);
146              
147 1         5 $self->processSymboltable($symboltable, $options);
148             }
149              
150             ##
151             # translatefiles: parse the antlr4 input grammar from the input file(s),
152             # generate the Marpa::R2 output grammar.
153             ##
154             sub translatefiles
155             {
156 0     0 0   my ( $self, $inputfiles, $options ) = @_;
157              
158 0           my $parser = new MarpaX::G4::Parser;
159 0 0         $parser->enabletrace if exists $options->{t};
160 0 0         $parser->ignoreredirect if exists $options->{i};
161              
162 0           my $symboltable = new MarpaX::G4::Symboltable;
163              
164 0           while (scalar @$inputfiles)
165             {
166 0           my $infile = shift @$inputfiles;
167 0           my $grammartext = readFile($infile);
168 0           my $data = $parser->parse($grammartext);
169 0 0         if ( exists $options->{d} )
170             {
171 0           $Data::Dumper::Indent = 2;
172 0           print Dumper($data);
173             }
174 0           $symboltable->importParseTree($data);
175             }
176              
177 0           $self->processSymboltable($symboltable, $options);
178             }
179              
180             1;
181              
182             # ABSTRACT: translate parsed antlr4 rules to Marpa2 syntax
183              
184             =head1 SYNOPSIS
185             use MarpaX::G4;
186              
187             =head1 DESCRIPTION
188             Translate the rules from the symbol table created from the imported ANTLR4 grammar
189             into Marpa syntax and write them to output.
190              
191             =cut