attached a patch for fixing
* some things for parsing PASM instructions correctly
* minor updates to pir.pg
regards,
kjs
Index: languages/PIR/lib/pasm_args.pg
===================================================================
--- languages/PIR/lib/pasm_args.pg (revision 17016)
+++ languages/PIR/lib/pasm_args.pg (working copy)
@@ -1,4 +1,4 @@
-grammar PIRGrammar;
+grammar PIR::Grammar;
# This file contains helper rules to handle
# the PASM instruction arguments. Many instructions
Index: languages/PIR/lib/pasm_core.pg
===================================================================
--- languages/PIR/lib/pasm_core.pg (revision 17016)
+++ languages/PIR/lib/pasm_core.pg (working copy)
@@ -7,59 +7,59 @@
#
end
| noop
-| reserved <int_constant>
-| load_bytecode <arg_string>
+| reserved <arg_hack> #<int_constant>
+| load_bytecode <arg_hack> #<arg_string>
#
# control flow
#
-| branch <arg_int>
-| branch_cs <arg_string>
-| bsr <arg_int>
+| branch <arg_hack> #<arg_int>
+| branch_cs <arg_hack> #<arg_string>
+| bsr <arg_hack> #<arg_int>
| ret
| jsr <arg_int>
| enternative
# conditional branch
-| if <var> \, <arg_int>
-| unless <var> \, <arg_int>
- # subroutine ops
-| invokecc <arg_pmc_var>
-| invoke <arg_pmc_var> \, <arg_pmc_var>
-| yield
-| tailcall <arg_pmc_var>
-| returncc
-| newclosure <arg_pmc_var> \, <arg_pmc_var>
+| if <arg_hack> #<target> \, <arg_int>
+| unless <arg_hack> #<target> \, <arg_int>
+ # subroutine ops <arg_hack> #
+| invokecc <arg_hack> #<arg_pmc_target>
+| invoke <arg_hack> #<arg_pmc_target> \, <arg_pmc_target>
+| yield <arg_hack> #
+| tailcall <arg_hack> #<arg_pmc_target>
+| returncc <arg_hack> #
+| newclosure <arg_hack> #<arg_pmc_target> \, <arg_pmc_target>
# function args ops
-| set_args <arg_set_args>
-| get_results <arg_get_results>
-| get_params <arg_get_params>
-| set_returns <arg_set_returns>
+| set_args <arg_hack> # <arg_set_args>
+| get_results <arg_hack> # <arg_get_results>
+| get_params <arg_hack> # <arg_get_params>
+| set_returns <arg_hack> # <arg_set_returns>
| result_info <arg_hack>
# address manipulation
-| set_addr <arg_hack> #<var> \, <int_constant>
-| get_addr <arg_hack> #<var> \, <var>
+| set_addr <arg_hack> #<target> \, <int_constant>
+| get_addr <arg_hack> #<target> \, <target>
# exception handling
| push_eh <arg_hack> #<id>
| clear_eh <arg_hack> #
-| throw <arg_hack> #<var>
-| rethrow <arg_hack> #<var>
+| throw <arg_hack> #<target>
+| rethrow <arg_hack> #<target>
| die <arg_hack> #<int_constant> \, <int_constant>
| exit <arg_hack> #<int_constant>
| pushmark <arg_hack> #<int_constant>
| popmark <arg_hack> #<int_constant>
-| pushaction <arg_hack> #<var>
+| pushaction <arg_hack> #<target>
# interpreter ops
| debug <arg_hack> #<int_constant>
| bounds <arg_hack> #<int_constant>
| profile <arg_hack> #<int_constant>
| trace <arg_hack> #<int_constant>
| gc_debug <arg_hack> #<int_constant>
-| interpinfo <arg_hack> #<var> \, <int_constant>
+| interpinfo <arg_hack> #<target> \, <int_constant>
| warningson <arg_hack> #<int_constant>
| warningsoff <arg_hack> #<int_constant>
| errorson <arg_hack> #<int_constant>
| errorsoff <arg_hack> #<int_constant>
-| runinterp <arg_hack> #<var> \, <int_constant>
-| getinterp <arg_hack> #<var>
+| runinterp <arg_hack> #<target> \, <int_constant>
+| getinterp <arg_hack> #<target>
# DOD/GC
| sweep <arg_hack> #<int_constant>
| collect
@@ -67,11 +67,11 @@
| sweepon
| collectoff
| collecton
-| needs_destroy <arg_hack> #<var>
+| needs_destroy <arg_hack> #<target>
# NCI
-| loadlib <arg_hack> #<var> \, <var>
-| dlfunc <arg_hack> #<var> \, <var> \, <var> \, <var>
-| dlvar <arg_hack> #<var> \, <var> \, <var>
-| compreg <arg_hack> #<var> \, <var>
-| new_callback <arg_hack> #<var> \, <var> \, <var> \, <var>
+| loadlib <arg_hack> #<target> \, <target>
+| dlfunc <arg_hack> #<target> \, <target> \, <target> \, <target>
+| dltarget <arg_hack> #<target> \, <target> \, <target>
+| compreg <arg_hack> #<target> \, <target>
+| new_callback <arg_hack> #<target> \, <target> \, <target> \, <target>
}
Index: languages/PIR/lib/pasm_instr.pg
===================================================================
--- languages/PIR/lib/pasm_instr.pg (revision 17016)
+++ languages/PIR/lib/pasm_instr.pg (working copy)
@@ -7,320 +7,322 @@
# PGE implements this.
token pasm_instruction {
- end
-| noop
-| reserved
-| load_bytecode
-| branch
-| branch_cs
-| bsr
-| ret
-| jsr <arg_int>
-| enternative
-| if
+[ yield
+| xor
+| warningson
+| warningsoff
+| valid_type
+| upcase
+| unshift
+| unregister
+| unpin
+| unless_null
| unless
-| invokecc
-| invoke
-| yield
-| tailcall
-| returncc
+| typeof
+| trans_encoding
+| trans_charset
+| trace
+| titlecase
+| time
+| throw
+| thaw
+| tell
+| tanh
+| tan
+| tailcallmethod
+| tailcall
+| sysinfo
+| sweepon
+| sweepoff
+| sweep
+| substr
+| subclass
+| sub
+| stringinfo
+| store_lex
+| stat
+| sqrt
+| sprintf
+| split
+| spawnw
+| socket
+| sockaddr
+| sleep
+| sizeof
+| sinh
+| singleton
+| sin
+| shr
+| shl
+| shift
+| setstdout
+| setstderr
+| sets_ind
+| setref
+| setprop
+| setp_ind
+| setn_ind
+| seti_ind
+| setattribute
+| set_root_global
+| set_returns
+| set_hll_global
+| set_global
+| set_args
+| set_addr
+| set
+| send
+| seek
+| sech
+| sec
+| savec
+| saveall
+| save
+| runinterp
+| rotate_up
+| rot
+| returncc
+| rethrow
+| ret
+| result_info
+| restoreall
+| restore
+| reserved
+| repeat
+| removeparent
+| removedoes
+| removeattribute
+| register
+| recv
+| readline
+| read
+| pushmark
+| pushaction
+| push_eh
+| push
+| prophash
+| profile
+| printerr
+| print
+| print
+| pow
+| popmark
+| pop
+| poll
+| pioctl
+| pin
+| peek
+| ord
+| or
+| open
+| null
+| not
+| noop
| newclosure
-| set_args
-| get_results
-| get_params
-| set_returns
-| result_info
-| set_addr
+| newclass
+| new_callback
+| new
+| new
+| neg
+| needs_destroy
+| ne_str
+| ne_num
+| ne_addr
+| ne
+| n_repeat
+| n_not
+| n_neg
+| n_infix
+| n_concat
+| n_bnots
+| n_bnot
+| n_abs
+| mul
+| mod
+| mmdvtregister
+| mmdvtfind
+| lt_str
+| lt_num
+| lt_addr
+| lt
+| lsr
+| lookback
+| log2
+| log10
+| localtime
+| loadlib
+| load_bytecode
+| ln
+| listen
+| length
+| le_str
+| le_num
+| le_addr
+| le
+| lcm
+| jsr
+| join
+| istrue
+| issame
+| isnull
+| isntsame
+| isne
+| islt
+| isle
+| isgt
+| isge
+| isfalse
+| iseq
+| isa
+| is_cclass
+| invokecc
+| invoke
+| interpinfo
+| infix
+| index
+| inc
+| if_null
+| if
+| hash
+| gt_str
+| gt_num
+| gt_addr
+| gt
+| gmtime
+| getstdout
+| getstdin
+| getstderr
+| getprop
+| getline
+| getinterp
+| getfile
+| getfd
+| getclass
+| getattribute
+| get_root_namespace
+| get_root_global
+| get_results
+| get_repr
+| get_params
+| get_namespace
+| get_mro
+| get_hll_namespace
+| get_hll_global
+| get_global
| get_addr
-| push_eh
-| clear_eh
-| throw
-| rethrow
-| die
-| exit
-| pushmark
-| popmark
-| pushaction
-| debug
-| bounds
-| profile
-| trace
-| gc_debug
-| interpinfo
-| warningson
-| warningsoff
-| errorson
-| errorsoff
-| runinterp
-| getinterp
-| sweep
-| collect
-| sweepoff
-| sweepon
-| collectoff
-| collecton
-| needs_destroy
-| loadlib
-| dlfunc
-| dlvar
-| compreg
-| new_callback
-| band
-| bands
-| bnot
-| n_bnot
-| bnots
-| n_bnots
-| bor
-| bors
-| shl
-| shr
-| lsr
-| rot
-| bxor
-| bxors
-| eq
-| eq_str
-| eq_num
-| eq_addr
-| ne
-| ne_str
-| ne_num
-| ne_addr
-| lt
-| lt_str
-| lt_num
-| lt_addr
-| le
-| le_str
-| le_num
-| le_addr
-| gt
-| gt_str
-| gt_num
-| gt_addr
-| ge
-| ge_str
-| ge_num
-| ge_addr
-| if_null
-| unless_null
-| cmp
-| cmp_str
-| cmp_num
-| issame
-| isntsame
-| istrue
-| isfalse
-| isnull
-| isge
-| isgt
-| isle
-| islt
-| iseq
-| isne
-| and
-| not
-| n_not
-| or
-| xor
-| debug_init
-| debug_load
-| debug_break
-| debug_print
-| backtrace
-| getline
-| getfile
-| close
-| fdopen
-| getfd
-| getstdin
-| getstdout
-| getstderr
-| setstdout
-| setstderr
-| pioctl
-| open
-| print
-| printerr
-| print
-| read
-| readline
-| peek
-| stat
-| seek
-| tell
-| socket
-| sockaddr
-| connect
-| recv
-| send
-| poll
-| bind
-| listen
-| accept
-| infix
-| n_infix
-| abs
-| n_abs
-| add
-| cmod
-| dec
-| div
-| fdiv
-| ceil
-| floor
-| inc
-| mod
-| mul
-| neg
-| n_neg
-| pow
-| sub
-| sqrt
-| acos
-| asec
-| asin
-| atan
-| cos
-| cosh
-| exp
-| ln
-| log10
-| log2
-| sec
-| sech
-| sin
-| sinh
-| tan
-| tanh
-| gcd
-| lcm
-| fact
-| callmethodcc
-| callmethod
-| tailcallmethod
-| addmethod
-| can
-| does
-| isa
-| newclass
-| subclass
-| getclass
-| singleton
-| class
-| classname
-| addparent
-| removeparent
-| addattribute
-| removeattribute
-| getattribute
-| setattribute
-| classoffset
-| adddoes
-| removedoes
-| new
-| typeof
-| find_type
-| valid_type
-| get_repr
-| find_method
-| defined
-| exists
-| delete
-| elements
-| push
-| pop
-| unshift
-| shift
-| setprop
-| getprop
-| delprop
-| prophash
-| freeze
-| thaw
-| mmdvtregister
-| mmdvtfind
-| register
-| unregister
-| hash
-| get_mro
-| clone
-| exchange
-| set
-| assign
-| setref
-| deref
-| setp_ind
-| setn_ind
-| sets_ind
-| seti_ind
-| null
-| cleari
-| clearn
-| clearp
-| clears
-| saveall
-| restoreall
-| entrytype
-| depth
-| lookback
-| save
-| savec
-| restore
-| rotate_up
-| ord
-| chr
-| chopn
-| concat
-| n_concat
-| repeat
-| n_repeat
-| length
-| bytelength
-| pin
-| unpin
-| substr
-| index
-| sprintf
-| new # ??
-| stringinfo
-| upcase
-| downcase
-| titlecase
-| join
-| split
-| charset
-| charsetname
-| find_charset
-| trans_charset
-| encoding
-| find_encoding
-| trans_encoding
-| is_cclass
-| find_cclass
-| find_not_cclass
-| escape
-| compose
-| spawnw
-| err
-| time
-| gmtime
-| localtime
-| decodetime
-| decodelocaltime
-| sysinfo
-| sleep
-| sizeof
-| store_lex
-| find_lex
-| get_namespace
-| get_hll_namespace
-| get_root_namespace
-| get_global
-| get_hll_global
-| get_root_global
-| set_global
-| set_hll_global
-| set_root_global
+| ge_str
+| ge_num
+| ge_addr
+| ge
+| gcd
+| gc_debug
+| freeze
+| floor
+| find_type
+| find_not_cclass
+| find_name
+| find_method
+| find_lex
+| find_encoding
+| find_charset
+| find_cclass
+| fdopen
+| fdiv
+| fact
+| exp
+| exit
+| exists
+| exchange
+| escape
+| errorson
+| errorsoff
+| err
+| eq_str
+| eq_num
+| eq_addr
+| eq
+| entrytype
+| enternative
+| end
+| encoding
+| elements
+| downcase
+| does
+| dlvar
+| dlfunc
+| div
+| die
+| deref
+| depth
+| delprop
+| delete
+| defined
+| decodetime
+| decodelocaltime
+| dec
+| debug_print
+| debug_load
+| debug_init
+| debug_break
+| debug
+| cosh
+| cos
+| connect
+| concat
+| compreg
+| compose
+| collecton
+| collectoff
+| collect
+| cmp_str
+| cmp_num
+| cmp
+| cmod
+| close
+| clone
+| clears
+| clearp
+| clearn
+| cleari
+| clear_eh
+| classoffset
+| classname
+| class
+| chr
+| chopn
+| charsetname
+| charset
+| ceil
+| can
+| callmethodcc
+| callmethod
+| bytelength
+| bxors
+| bxor
+| bsr
+| branch_cs
+| branch
+| bounds
+| bors
+| bor
+| bnots
+| bnot
+| bind
+| bands
+| band
+| backtrace
+| atan
+| assign
+| asin
+| asec
+| and
+| addparent
+| addmethod
+| adddoes
+| addattribute
+| add
+| acos
+| accept
+| abs
+] \b
}
Index: languages/PIR/lib/pir.pg
===================================================================
--- languages/PIR/lib/pir.pg (revision 17016)
+++ languages/PIR/lib/pir.pg (working copy)
@@ -2,8 +2,7 @@
# TO DO:
# 1. fix Heredocs parsing
-# 2. fix macro parsing
-# 3. Test and fix things
+# 2. Test and fix things
token TOP {
^ <program> [ $ | <syntax_error: end of file expected> ]
@@ -120,13 +119,15 @@
| <reg>
| <syntax_error: parameter type or register expected>
]
- <get_flags>?
+ <param_flags>
[ <?nl> | <syntax_error: newline expected after parameter declaration> ]
}
+rule param_flags {
+ [ <get_flags> | <':unique_reg'> ]*
+}
-
#
# PIR instructions
#
@@ -151,14 +152,11 @@
}
-# this is a token, because no spaces are allowed between
-# the id and the colon.
-token label {
- <id> <':'>
-}
+
rule pir_instr {
<local_decl>
+ | <sym_decl>
| <lexical_decl>
| <const_def>
| <globalconst_def>
@@ -181,18 +179,34 @@
## Locals and Lexicals
##
+
+=head2 Local declarations
+
+Local declarations can be done using C<.sym> or C<.local> in normal context.
+In macro context however, only C<.sym> is allowed, and the C<.local> keyword
+indicates a label declaration.
+
+=cut
+
rule local_decl {
- [ <'.local'> | <'.sym'> ]
+ <'.local'>
[ <type> | <syntax_error: type for local symbol expected> ]
<local_id_list>
}
+rule sym_decl {
+ <'.sym'>
+ [ <type> | <syntax_error: type for local symbol expected> ]
+ <local_id_list>
+}
+
+
rule local_id_list {
<local_id> [ <','> <local_id> ]*
}
rule local_id {
- <id> <local_flag>?
+ [ <id> | <syntax_error: identifier expected> ] <local_flag>?
}
## Maybe more future flags for local symbols
@@ -261,8 +275,8 @@
}
rule conditional_expr {
- [ <'null'> <target> ]
- | [ <simple_expr> [ <relational_operator> <simple_expr> ]? ]
+ <'null'> <target>
+ | <simple_expr> [ <relational_operator> <simple_expr> ]?
}
## Jump statements
@@ -358,8 +372,9 @@
<target> <'='> <short_sub_call>
| <target> <'='> <target> <keylist>
| <target> <'='> <expression>
- | <target> <'='> <pasm_op_1> <simple_expr>
- | <target> <'='> <pasm_op_2> <simple_expr> \, <simple_expr>
+ | <target> <'='> <pasm_instruction> \N*
+ #| <target> <'='> <pasm_op_1> <simple_expr>
+ #| <target> <'='> <pasm_op_2> <simple_expr> \, <simple_expr>
| <target> <'='> <'new'> [ <int_constant> | <string_constant> | <macro_id> ]
| <target> <'='> <'new'> <keylist>
| <target> <'='> <'find_type'> [ <string_constant> | <string_reg> | <id> ]
@@ -371,47 +386,33 @@
| <result_var_list> [ <'='> | <syntax_error: '=' expected> ] <short_sub_call>
}
-## Rewrite of assignment_stat
-##
-##rule assignment_stat {
-## <target> <'='> <rhs>
-##| <target> <op_assign> <simple_expr>
-##| <target> <keylist> <'='> <simple_expr>
-##| <'global'> <string_constant> <'='> <target> # deprecated?
-##| <result_var_list> [ <'='> | <syntax_error: '=' expected> ] <short_sub_call>
-##}
-##
-##rule rhs {
-## <short_sub_call>
-##| <expression>
-##| <pasm_op_1> <target>
-##| <pasm_op_2> <target> <','> <target>
-##| <'new'> [ <int_constant> | <string_constant> | <macro_id> ]
-##| <'find_type'> [ <string_constant> | <string_reg> | <id> ]
-##| <heredoc_string>
-##| <global'> <string_constant> # deprecated?
-##}
+## TODO :fix delete x[x] syntax in PASM
# pasm ops that take 1 argument
#
-rule pasm_op_1 {
- clone
- | compreg
- | defined
- | assign
- | addr
- | istrue
- | isfalse
- | isnull
- #| others
-}
-
-# pasm ops that take 2 arguments
+#rule pasm_op_1 {
+# [ clone
+# | compreg
+# | defined
+# | assign
+# | addr
+# | istrue
+# | isfalse
+# | isnull
+# | getclass
+# | find_type
+# | length
+# ] \b
+#}
#
-rule pasm_op_2 {
- issame
- | isntsame
-}
+## pasm ops that take 2 arguments
+##
+#rule pasm_op_2 {
+# [ issame
+# | isntsame
+# | subclass
+# ] \b
+#}
rule heredoc {
<'<<'>
@@ -461,7 +462,9 @@
| [ <target> <'->'> ]
]? # optional invocant
[ <target> | <string_constant> ] # method or sub name/id
- <parenthesized_args> # sub args
+ <parenthesized_args> # sub args
+ <process_heredocs>
+ <clear_heredocs>
}
rule sub_invocation {
@@ -500,11 +503,20 @@
[ <target> | <syntax_error: target for named argument expected> ]
]?
| <target>
+ | <heredoc_id>
] <set_flags>?
}
+token heredoc_id {
+ <'<<'> <string_constant> <store_heredoc_label: $1>
+}
+rule heredoc_label {
+ .* ^^ <ident> $$
+}
+
+
## Argument passing
##
rule arguments {
@@ -633,10 +645,15 @@
[ <')'> | <syntax_error: ')' expected> ]
}
-#### TODO: FIX
+# In order to be able to parse macro identifiers, before
+# the macro body is parsed, some rules are redefined.
+# After parsing the macro body, they are restored.
+#
regex macro_body {
- .*?
- <'.endm'> \h* \n
+ <init_macro_rules>
+ <labeled_pir_instr>*
+ <'.endm'>
+ <close_macro_rules>
}
@@ -713,6 +730,22 @@
# Tokens
#
+# this is a token, because no spaces are allowed between
+# the id and the colon.
+token normal_label {
+ <id> <':'>
+}
+
+
+token macro_label {
+ <'$'> <id> <':'>
+}
+
+rule macro_label_decl {
+ <'.local'> [ <macro_label> | <syntax_error: $LABEL: expected> ]
+ | <normal_label>
+}
+
token int_constant {
<binary_constant>
| <hex_constant>
@@ -762,12 +795,19 @@
}
-token target {
- [ <id> | <reg> ]
+token normal_target {
+ <id> | <reg>
}
+# in a macro, a target can also be a
+# macro_id
+#
+token macro_target {
+ <id> | <reg> | <macro_id>
+}
+
token id {
- <!keyword> \w+
+ <!keyword> \w+
}
token macro_id {