summaryrefslogtreecommitdiff
path: root/sys/src/cmd/pc.y
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-05-04 11:07:39 +0100
committeraiju <devnull@localhost>2018-05-04 11:07:39 +0100
commit454d26a0e4f91d03bb8f1f4f3f7dbe56d722deab (patch)
tree228dd7ad74b4cf0e5d863e7bfc37399a7eb0c458 /sys/src/cmd/pc.y
parentfa028a9352309fb1a6f1ee66218742ba5cfd921b (diff)
pc: add $ operator
Diffstat (limited to 'sys/src/cmd/pc.y')
-rw-r--r--sys/src/cmd/pc.y7
1 files changed, 7 insertions, 0 deletions
diff --git a/sys/src/cmd/pc.y b/sys/src/cmd/pc.y
index 039498d03..7592f578b 100644
--- a/sys/src/cmd/pc.y
+++ b/sys/src/cmd/pc.y
@@ -195,6 +195,10 @@ numbin(int op, Num *a, Num *b)
else
mpassign(b, a);
break;
+ case '$':
+ a->b = b->b;
+ mpxtend(b, mptoi(a), a);
+ break;
}
numdecref(b);
return a;
@@ -389,6 +393,7 @@ hexfix(Symbol *s)
%left unary
%left '*' '/' '%'
%right LOEXP
+%right '$'
%{
int save;
@@ -501,6 +506,7 @@ expr: LNUM
| '-' expr %prec unary { $$ = nummod($2); if($$ != nil) mpsub(mpzero, $$, $$); }
| '~' expr %prec unary { $$ = nummod($2); if($$ != nil) mpnot($$, $$); }
| '!' expr %prec unary { $$ = nummod($2); if($$ != nil) {itomp(mpcmp($$, mpzero) == 0, $$); $$->b = 0; } }
+ | '$' expr { $$ = nummod($2); if($$ != nil) if($2->sign > 0) mpxtend($2, mpsignif($2), $$); else mpassign($2, $$); }
| expr '?' expr ':' expr %prec '?' {
if($1 == nil || mpcmp($1, mpzero) != 0){
$$ = $3;
@@ -541,6 +547,7 @@ expr: LNUM
if($$ == nil) error("no last result");
else numincref($$);
}
+ | expr '$' expr { $$ = numbin('$', $1, $3); }
elist: { $$.n = 0; } | elist1
elist1: expr { $$.x[0] = $1; $$.n = 1; }