fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / compilers / tge / tgc.pir
blob2cdd297ea0094f52b2310bda4a4cd0d3624a87d1
1 # Copyright (C) 2006-2009, Parrot Foundation.
2 # $Id$
4 =head1 TITLE
6 tgc.pir - The TGE rules compiler
8 =head1 SYNOPSIS
10     > ./parrot compilers/tge/tgc.pir [OPTIONS] FILE
12 =head2 DESCRIPTION
14 This program takes a tree grammar, specified in B<FILE>, and compiles it
15 into the PIR code needed to execute that grammar. This PIR code is then
16 suitable for inclusion or compilation into other larger programs.
18 =head2 OPTIONS
20 =over 4
22 =item --output OUTFILE
24 Send the output to OUTFILE. By default, output is directed to STDOUT.
26 =cut
28 .include 'stdio.pasm'
30 .sub "main" :main
31     .param pmc args
32     .local string prog
33     .local string infile, outfile
35     load_bytecode "TGE.pbc"
36     load_bytecode "Getopt/Obj.pbc"
38     # Grab program name for error reporting
39     prog = shift args
41     # Sanity check parameters
42     $I0 = args
43     unless $I0 >= 1 goto ERR_TOO_FEW_ARGS
45     # Grab the final argument
46     infile = pop args
49     # Process command line options
50     .local pmc getopts
51     getopts = new ["Getopt";"Obj"]
52     getopts."notOptStop"(1)
53     push getopts, "output|o=s"
54     push getopts, "help|h"
55     .local pmc opts
56     opts = getopts."get_options"( args )
58     .local string help
59     help = opts['help']
60     if help goto USAGE
62     .local pmc outfh
64     .local int ck_output
65     ck_output = exists opts['output']
66     if ck_output goto OUTPUT_FILE
68   OUTPUT_STDOUT:
69     $P0 = getinterp
70     outfh = $P0.'stdhandle'(.PIO_STDOUT_FILENO)
71     goto OUTPUT_DONE
73   OUTPUT_FILE:
74     outfile = opts['output']
75     outfh = new ['FileHandle']
76     outfh.'open'(outfile, 'w')
77     unless outfh goto ERR_NO_OUTFILE
79   OUTPUT_DONE:
81     # Read grammar file and compile here
82     .local pmc infh
83     infh = new ['FileHandle']
84     infh.'open'(infile, 'r')
85     unless infh goto ERR_NO_INFILE
87     .local string source
88     source = infh.'read'(65535)
89     infh.'close'()
91     .local pmc grammar
92     grammar = new ['TGE';'Compiler']
94     .local string compiled_source
95     compiled_source = grammar.'precompile'(source, infile)
96     print outfh, compiled_source
97     unless ck_output goto END
99     # Close the output file and check result
100     $I0 = outfh.'close'()
101     unless $I0 goto END
102     die 'Error: close output failed'
104   goto END
106   USAGE:
107     $P0 = getinterp
108     $P1 = $P0.'stdhandle'(.PIO_STDERR_FILENO)
109     $P1.'print'("Usage: ")
110     $P1.'print'(prog)
111     $P1.'print'(" [OPTIONS] FILE\n")
112     $P1.'print'(<<"OPTIONS")
113  Options:
114   --output=OUTFILE  -- redirect output to OUTFILE
115   --help            -- print this message
116 OPTIONS
117     exit 1
119   ERR_TOO_FEW_ARGS:
120     $P0 = getinterp
121     $P1 = $P0.'stdhandle'(.PIO_STDERR_FILENO)
122     $P1.'print'("Error: too few arguments\n\n")
123     goto USAGE
125   ERR_NO_INFILE:
126     $P0 = getinterp
127     $P1 = $P0.'stdhandle'(.PIO_STDERR_FILENO)
128     $P1.'print'("Error: file not found: ")
129     $P1.'print'(infile)
130     $P1.'print'("\n\n")
131     goto USAGE
133   ERR_NO_OUTFILE:
134     $P0 = getinterp
135     $P1 = $P0.'stdhandle'(.PIO_STDERR_FILENO)
136     $P1.'print'("Error: file not found: ")
137     $P1.'print'(outfile)
138     $P1.'print'("\n\n")
139     goto USAGE
141   END:
142 .end
144 # Local Variables:
145 #   mode: pir
146 #   fill-column: 100
147 # End:
148 # vim: expandtab shiftwidth=4 ft=pir: