EYAPP(1) User Contributed Perl Documentation EYAPP(1)
NAME
eyapp - A Perl front-end to the Parse::Eyapp module
SYNOPSIS
eyapp [options] grammar[.eyp]
eyapp -V
eyapp -h
grammar The grammar file. If no suffix is given, and the file
does not exists, .eyp is added
DESCRIPTION
The eyapp compiler is a front-end to the Parse::Eyapp module, which lets
you compile Parse::Eyapp grammar input files into Perl LALR(1) Object
Oriented parser modules.
OPTIONS IN DETAIL
-v Creates a file grammar.output describing your parser. It will show
you a summary of conflicts, rules, the DFA (Deterministic Finite
Automaton) states and overall usage of the parser.
Implies option "-N". To produce a more detailed description of the
states, the LALR tables aren't compacted. Use the combination "-vN"
to produce an ".output" file corresponding to the compacted tables.
-s Create a standalone module in which the parsing driver is included.
The modules including the LALR driver (Parse::Eyapp::Driver), those
for AST manipulations (Parse::Eyapp::Node and Parse::Eyapp::YATW))
and Parse::Eyapp::Base are included - almost verbatim - inside the
generated module.
Note that if you have more than one parser module called from a
program, to have it standalone, you need this option only for one of
your grammars;
-n Disable source file line numbering embedded in your parser module. I
don't know why one should need it, but it's there.
-m module
Gives your parser module the package name (or name space or module
name or class name or whatever-you-call-it) of module. It defaults
to grammar
-o outfile
The compiled output file will be named outfile for your parser
module. It defaults to grammar.pm or, if you specified the option -m
A::Module::Name (see below), to Name.pm.
-c grammar[.eyp]
Produces as output (STDOUT) the grammar without the actions. Only the
syntactic parts are displayed. Comments will be also stripped if the
"-v" option is added.
-t filename
The -t filename option allows you to specify a file which should be
used as template for generating the parser output. The default is to
use the internal template defined in Parse::Eyapp::Output.pm. For
how to write your own template and which substitutions are available,
have a look to the module Parse::Eyapp::Output.pm : it should be
obvious.
-b shebang
If you work on systems that understand so called shebangs, and your
generated parser is directly an executable script, you can specify
one with the -b option, ie:
eyapp -b '/usr/local/bin/perl -w' -o myscript.pl myscript.yp
This will output a file called myscript.pl whose very first line is:
#!/usr/local/bin/perl -w
The argument is mandatory, but if you specify an empty string, the
value of $Config{perlpath} will be used instead.
-B prompt
Adds a modulino call '__PACKAGE->main(<prompt>) unless caller();' as
the very last line of the output file. The argument is mandatory.
-C grammar.eyp
An abbreviation for the combined use of -b '' and -B ''
-T grammar.eyp
Equivalent to %tree.
-N grammar.eyp
Equivalent to the directive %nocompact. Do not compact LALR action
tables.
-l Do not provide a default lexical analyzer. By default "eyapp" builds
a lexical analyzer from your "%token = /regexp/" definitions
grammar
The input grammar file. If no suffix is given, and the file does not
exists, an attempt to open the file with a suffix of .eyp is tried
before exiting.
-V Display current version of Parse::Eyapp and gracefully exits.
-h Display the usage screen.
EXAMPLE
The following "eyapp" program translates an infix expression like "2+3*4"
to postfix: "2 3 4 * +"
%token NUM = /([0-9]+(?:\.[0-9]+)?)/
%token VAR = /([A-Za-z][A-Za-z0-9_]*)/
%right '='
%left '-' '+'
%left '*' '/'
%left NEG
%defaultaction { "$left $right $op"; }
%%
line: $exp { print "$exp\n" }
;
exp: $NUM { $NUM }
| $VAR { $VAR }
| VAR.left '='.op exp.right
| exp.left '+'.op exp.right
| exp.left '-'.op exp.right
| exp.left '*'.op exp.right
| exp.left '/'.op exp.right
| '-' $exp %prec NEG { "$exp NEG" }
| '(' $exp ')' { $exp }
;
%%
Notice that there is no need to write lexer and error report subroutines.
First, we compile the grammar:
pl@nereida:~/LEyapp/examples/eyappintro$ eyapp -o postfix.pl -C Postfix.eyp
If we use the "-C" option and no "main()" was written one default "main"
sub is provided. We can now execute the resulting program:
pl@nereida:~/LEyapp/examples/eyappintro$ ./postfix.pl -c 'a = 2*3 +b'
a 2 3 * b + =
When a non conformant input is given, it produces an accurate error
message:
pl@nereida:~/LEyapp/examples/eyappintro$ ./postfix.pl -c 'a = 2**3 +b'
Syntax error near '*'.
Expected one of these terminals: '-' 'NUM' 'VAR' '('
There were 1 errors during parsing
AUTHOR
Casiano Rodriguez-Leon
COPYRIGHT
Copyright © 2006, 2007, 2008, 2009, 2010, 2011, 2012 Casiano Rodriguez-
Leon. Copyright © 2017 William N. Braswell, Jr. All Rights Reserved.
Parse::Yapp is Copyright © 1998, 1999, 2000, 2001, Francois Desarmenien.
Parse::Yapp is Copyright © 2017 William N. Braswell, Jr. All Rights
Reserved.
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself, either Perl version 5.8.8 or, at
your option, any later version of Perl 5 you may have available.
SEE ALSO
• Parse::Eyapp,
• perldoc vgg,
• The tutorial Parsing Strings and Trees with "Parse::Eyapp" (An
Introduction to Compiler Construction in seven pages)> in
• The pdf file in
<http://nereida.deioc.ull.es/~pl/perlexamples/Eyapp.pdf>
• <http://nereida.deioc.ull.es/~pl/perlexamples/section_eyappts.html>
(Spanish),
• eyapp,
• treereg,
• Parse::yapp,
• yacc(1),
• bison(1),
• the classic book "Compilers: Principles, Techniques, and Tools" by
Alfred V. Aho, Ravi Sethi and
• Jeffrey D. Ullman (Addison-Wesley 1986)
• Parse::RecDescent.
POD ERRORS
Hey! The above document had some coding errors, which are explained
below:
Around line 199:
Non-ASCII character seen before =encoding in '©'. Assuming UTF-8
perl v5.30.2 2017-06-14 EYAPP(1)