hi,
attached a patch for lang/PIR fixing:
* add command line options to specify the kind of output:
- parse only (used for tests currently)
- PAST
- PIR
- parse and dump parse tree.
(I stole the code from tge.pir)
regards,
kjs
Index: languages/PIR/pirc.pir
===================================================================
--- languages/PIR/pirc.pir (revision 16932)
+++ languages/PIR/pirc.pir (working copy)
@@ -1,17 +1,21 @@
-.namespace [ 'PIR' ]
+#
+# specify a different namespace than "PIR", as "PIR" is a built-in language
+#
+.namespace [ 'PIR-lang' ]
.include "errors.pasm"
-.sub '__onload' :load, :init
+.sub '__onload' :load :init
load_bytecode 'PGE.pbc'
- load_bytecode 'Parrot/HLLCompiler.pir'
+ load_bytecode 'Parrot/HLLCompiler.pbc'
load_bytecode 'PAST-pm.pbc'
load_bytecode 'PGE/Util.pbc'
-
+ load_bytecode 'PGE/Text.pbc'
+
load_bytecode 'languages/PIR/lib/ASTGrammar.pbc'
$P0 = new [ 'HLLCompiler' ]
- $P0.'language'('PIR')
+ $P0.'language'('languages-PIR')
$P0.'parsegrammar'('PIRGrammar')
$P0.'astgrammar'('ASTGrammar')
@@ -19,57 +23,116 @@
.sub 'main' :main
.param pmc args
-
- ## prevent printing of ASTs to the screen
- #load_bytecode 'PGE/Dumper.pbc'
- #load_bytecode 'dumper.pbc'
-
- $P0 = compreg 'PIR'
-
+
+ # get program name for error reporting
+ .local string prog
+ prog = shift args
+
+ # Sanity check parameters
+ $I0 = args
+ unless $I0 >= 1 goto ERR_TOO_FEW_ARGS
+
+ # Register the PIR compiler
+ $P0 = compreg 'languages-PIR'
+
# set up a global variable to keep track of syntax errors
.local pmc errs
errs = new .Integer
set_root_global 'errors', errs
- push_eh unexpected_exc
+
+ # Process command line options
+ load_bytecode "Getopt/Obj.pir"
+
+ .local pmc getopts
+ getopts = new "Getopt::Obj"
+ getopts."notOptStop"(1)
+ push getopts, "output|o=s"
+ push getopts, "help|h"
+ .local pmc opts
+ opts = getopts."get_options"( args )
+
+ # put back the program name
+ unshift args, prog
+
+ # handle help option
+ .local string help
+ help = opts['help']
+ if help goto USAGE
+
+ # handle target option
+ .local string output
+ output = opts['output']
+ unless output goto OPTIONS_DONE
+ if output == "PARSE" goto TARGET_PARSE
+ if output == "PAST" goto TARGET_PAST
+ if output == "PIRTIDY" goto TARGET_PIR
+ if output == "PARSETREE" goto TARGET_PARSETREE
+ goto ERR_UNKNOWN_TARGET
+
+ OPTIONS_DONE:
+
+ TARGET_PARSE:
$P1 = $P0.'command_line'(args, 'target' => 'parse')
- #$P1 = $P0.'command_line'(args, 'target' => 'past')
- #$P1 = $P0.'command_line'(args)
- if errs > 0 goto err_msg
- print "Parse successful!\n"
-
- clear_eh
+ goto DONE
+
+ TARGET_PARSETREE:
+ load_bytecode 'PGE/Dumper.pbc'
+ load_bytecode 'dumper.pbc'
+ $P1 = $P0.'command_line'(args, 'target' => 'parse')
+ goto DONE
+
+ TARGET_PAST:
+ $P1 = $P0.'command_line'(args, 'target' => 'past')
+ goto DONE
+
+ TARGET_PIR:
+ $P1 = $P0.'command_line'(args, 'target' => 'PIR')
+ goto DONE
+
+ ##COMPILE_AND_RUN:
+ ## $P1 = $P0.'command_line'(args)
+
+ DONE:
+ if errs > 0 goto ERR_MSG
+ print "Parse successful!\n"
.return($P1)
- err_msg:
- printerr "There "
- if errs == 1 goto one_error
- printerr "were "
+ ERR_MSG:
+ if errs == 1 goto ONE_ERROR
+ printerr "There were"
printerr errs
- printerr " errors.\n"
+ printerr " errors.\n"
end
- one_error:
- printerr "was 1 error.\n"
+ ONE_ERROR:
+ printerr "There was 1 error.\n"
end
+
+ USAGE:
+ printerr "Usage: "
+ printerr prog
+ printerr " [OPTIONS] FILE\n"
+ printerr <<"OPTIONS"
+ Options:
+ --help -- print this message
+ --output=TARGET -- specify target
+ possible targets are:
+ PARSE -- parse only (default)
+ PAST -- print Parrot AST
+ PIRTIDY -- print generated PIR code
+ PARSETREE -- parse and print parse tree
+OPTIONS
+ exit 1
- unexpected_exc:
- .local pmc exception, message
- .get_results (exception, message)
- printerr "Unexpected exception: "
- if null message goto no_msg
- if null exception goto no_exc
-
- printerr message
- printerr "\n"
- end
-
- no_msg:
- printerr "No message"
- end
- no_exc:
- printerr "No exception\n"
- end
+ ERR_TOO_FEW_ARGS:
+ printerr "Error: too few arguments\n"
+ goto USAGE
+ ERR_UNKNOWN_TARGET:
+ printerr "Error: "
+ printerr output
+ printerr " is an unknown target\n"
+ exit 1
.end
@@ -97,54 +160,56 @@
.sub warning
- .param pmc self
- .param string message
-
-
- if null self goto no_self
- if null message goto no_msg
-
- printerr "Warning: "
- $P0 = get_hll_global ['PGE::Util'], 'warn'
- if null $P0 goto no_warn
- self.$P0(message)
- .return()
-no_warn:
- print "Cannot find method 'warn'\n"
- .return()
-no_msg:
- print "Warning: 'no message specified for warning()\n"
- .return()
-no_self:
- print "No 'self' in warning()\n"
- .return()
+ .param pmc self
+ .param string message
+
+ if null self goto NO_SELF
+ if null message goto NO_MSG
+
+ printerr "Warning: "
+ $P0 = get_hll_global ['PGE::Util'], 'warn'
+ if null $P0 goto NO_WARN
+ self.$P0(message)
+ .return()
+ NO_WARN:
+ printerr "Cannot find method 'warn'\n"
+ .return()
+ NO_MSG:
+ printerr "Warning: 'no message specified for warning()\n"
+ .return()
+ NO_SELF:
+ printerr "No 'self' in warning()\n"
+
+ .return()
.end
.sub syntax_error
- .param pmc self
- .param string message
-
- $P0 = get_hll_global ['PGE::Util'], 'line_number'
- if null $P0 goto no_line_nr_method
- $I0 = self.$P0()
-
- # line_number() starts counting at line 0, so increment:
- inc $I0
-
- printerr "Syntax error (line "
- printerr $I0
- printerr "): "
- printerr message
- printerr "\n\n"
-
- .local pmc errs
- errs = get_root_global 'errors'
- inc errs
-
- .return()
-no_line_nr_method:
- printerr "can't find PGE::Util::line_number"
- end
+ .param pmc self
+ .param string message
+
+ $P0 = get_hll_global ['PGE::Util'], 'line_number'
+ if null $P0 goto NO_LINE_NR_METHOD
+ $I0 = self.$P0()
+
+ # line_number() starts counting at line 0, so increment:
+ inc $I0
+
+ printerr "Syntax error (line "
+ printerr $I0
+ printerr "): "
+ printerr message
+ printerr "\n\n"
+
+ # increment parse errors
+ .local pmc errs
+ errs = get_root_global 'errors'
+ inc errs
+
+ .return()
+
+ NO_LINE_NR_METHOD:
+ printerr "can't find PGE::Util::line_number"
+ exit 1
.end