Skip to content
This repository has been archived by the owner on Feb 3, 2021. It is now read-only.

Commit

Permalink
Add list associativity.
Browse files Browse the repository at this point in the history
  • Loading branch information
pmichaud committed Oct 20, 2009
1 parent bcd5543 commit 7591d1c
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 11 deletions.
11 changes: 6 additions & 5 deletions src/HLL/Actions.pm
Expand Up @@ -4,17 +4,18 @@ method EXPR($/, $key?) {
unless $key { return 0; }
my $past := $<OPER>.peek_ast;
unless $past {
if $key eq 'LIST' { $key := 'infix'; }
my $name := Q:PIR {
$P0 = find_lex '$key'
$S0 = $P0
$S0 = downcase $S0
%r = box $S0
} ~ ':<' ~ $key ~ '>';
$past := PAST::OP.new( :name($name), :node($/) );
} ~ ':<' ~ $<OPER><sym> ~ '>';
$past := PAST::Op.new( :name($name), :node($/) );
}
$past[0] := $/[0].ast;
if $key eq 'INFIX' {
$past[1] := $/[1].ast;
if $key eq 'POSTFIX' { $past.unshift($/[0].ast); }
else {
for $/.list { $past.push($_.ast); }
}
make $past;
}
Expand Down
5 changes: 3 additions & 2 deletions src/NQP/Actions.pm
Expand Up @@ -7,7 +7,8 @@ NQP::Grammar.O(':prec<w=>, :assoc<left>', '%exponentiation');
NQP::Grammar.O(':prec<v=>, :assoc<unary>', '%symbolic_unary');
NQP::Grammar.O(':prec<u=>, :assoc<left>', '%multiplicative');
NQP::Grammar.O(':prec<t=>, :assoc<left>', '%additive');
NQP::Grammar.O(':prec<i=>, :assoc<right>', '%assignment');
NQP::Grammar.O(':prec<r=>, :assoc<list>', '%concatenation');
NQP::Grammar.O(':prec<i=>, :assoc<right>', '%assignment');

method TOP($/) { make $<EXPR>.ast; }

Expand All @@ -16,7 +17,7 @@ method term:sym<value>($/) { make $<value>.ast; }
method circumfix:sym<( )>($/) { make $<EXPR>.ast; }

method postcircumfix:sym<[ ]>($/) {
make PAST::Var.new( 0, $<EXPR>.ast , :scope('keyed_int') );
make PAST::Var.new( $<EXPR>.ast , :scope('keyed_int') );
}

method value($/) {
Expand Down
1 change: 1 addition & 0 deletions src/NQP/Grammar.pm
Expand Up @@ -13,6 +13,7 @@ token infix:sym<%> { $<sym>=['%'] <O('%multiplicative, :pirop<mod>')> }
token infix:sym<+> { $<sym>=['+'] <O('%additive , :pirop<add>')> }
token infix:sym<-> { $<sym>=['-'] <O('%additive , :pirop<sub>')> }
token infix:sym<=> { $<sym>=['='] <O('%assignment')> }
token infix:sym<~> { $<sym>=['~'] <O('%concatenation')> }

token prefix:sym<-> { $<sym>=['-'] <O('%symbolic_unary')> }
token prefix:sym<--> { $<sym>=['--'] <O('%autoincrement')> }
Expand Down
32 changes: 28 additions & 4 deletions src/cheats/hll-grammar.pir
Expand Up @@ -377,6 +377,7 @@ An operator precedence parser.
term_loop:
here = here.termish()
unless here goto fail
termish = 'termish'
.local pmc term
term = here.'MATCH'()
push termstack, term
Expand Down Expand Up @@ -499,13 +500,14 @@ An operator precedence parser.
termstack = find_lex '@termstack'
opstack = find_lex '@opstack'

.local pmc op
.local pmc op, opOPER, opO
.local string opassoc
op = pop opstack
$P0 = op['OPER']
$P0 = $P0['O']
opassoc = $P0['assoc']
opOPER = op['OPER']
opO = opOPER['O']
opassoc = opO['assoc']
if opassoc == 'unary' goto op_unary
if opassoc == 'list' goto op_list
op_infix:
.local pmc right, left
right = pop termstack
Expand All @@ -514,6 +516,7 @@ An operator precedence parser.
op[1] = right
self.'!reduce'('EXPR', 'INFIX', op)
goto done

op_unary:
.local pmc arg, afrom, ofrom
arg = pop termstack
Expand All @@ -528,6 +531,27 @@ An operator precedence parser.
self.'!reduce'('EXPR', 'POSTFIX', op)
goto done

op_list:
.local string sym
sym = opOPER['sym']
arg = pop termstack
unshift op, arg
op_sym_loop:
unless opstack goto op_sym_done
$P0 = opstack[-1]
$P0 = $P0['OPER']
$S0 = $P0['sym']
if sym != $S0 goto op_sym_done
arg = pop termstack
unshift op, arg
$P0 = pop opstack
goto op_sym_loop
op_sym_done:
arg = pop termstack
unshift op, arg
self.'!reduce'('EXPR', 'LIST', op)
goto done

done:
push termstack, op
.end
Expand Down

0 comments on commit 7591d1c

Please sign in to comment.