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

Commit

Permalink
Browse files Browse the repository at this point in the history
More quote_EXPR and quoting improvements.
  • Loading branch information
pmichaud committed Oct 20, 2009
1 parent 7451fb8 commit b179ffb
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 9 deletions.
36 changes: 34 additions & 2 deletions src/HLL/Actions.pm
Expand Up @@ -47,12 +47,36 @@ method octint($/) {
make string_to_int( $/, 8 );
}

method quote_EXPR($/) {
make $<quote_delimited>.ast;
}

method quote_delimited($/) {
my $past := PAST::Op.new( :pirop('concat'), :node($/) );
my $str := '';
my $lastlit := 0;
for $<quote_atom> {
$str := $str ~ $_.ast;
my $ast := $_.ast;
if isPAST($ast) {
if $lastlit && $ast.isa(PAST::Val) {
$lastlit.value( $lastlit.value ~ $ast.value );
}
else {
$past.push($ast);
$lastlit := $ast.isa(PAST::Val) ?? $ast !! 0;
}
}
elsif $lastlit {
$lastlit.value( $lastlit.value ~ $ast );
}
else {
$lastlit := PAST::Val.new( :value($ast) );
$past.push($lastlit);
}
}
make PAST::Val.new(:value($str), :node($/));
if +$past.list < 1 { $past := PAST::Val.new( :value('') ); }
elsif +$past.list == 1 { $past := $past[0]; }
make $past;
}

method quote_atom($/) {
Expand Down Expand Up @@ -129,3 +153,11 @@ sub ints_to_string($ints) {
%r = box result
};
}

sub isPAST($x) {
Q:PIR {
$P0 = find_lex '$x'
$I0 = isa $P0, ['PAST';'Node']
%r = box $I0
}
}
3 changes: 3 additions & 0 deletions src/HLL/Grammar.pm
@@ -1,5 +1,7 @@
grammar HLL::Grammar;

# method EXPR is in src/cheats/hll-grammar.pir

token termish {
<prefixish>*
<noun>
Expand All @@ -23,6 +25,7 @@ grammar HLL::Grammar;
| <OPER=postcircumfix=postcircumfix>
}

# token quote_EXPR is in src/cheats/hll-grammar.pir
token quote_delimited {
<starter> <quote_atom>* <stopper>
}
Expand Down
9 changes: 3 additions & 6 deletions src/NQP/Actions.pm
Expand Up @@ -22,12 +22,9 @@ method postcircumfix:sym<[ ]>($/) {
}

method value($/) {
my $past := PAST::Val.new(
:value($<integer>
?? $<integer>.ast
!! $<quote_delimited>.ast
)
);
my $past := $<quote_EXPR>
?? $<quote_EXPR>.ast
!! PAST::Val.new( :value($<integer>.ast) );
make $past;
}

Expand Down
2 changes: 1 addition & 1 deletion src/NQP/Grammar.pm
Expand Up @@ -30,7 +30,7 @@ token postcircumfix:sym<[ ]> {

token value {
| <integer>
| <quote_delimited>
| <quote_EXPR>
}

proto token quote { <...> }
Expand Down

0 comments on commit b179ffb

Please sign in to comment.