mirror of
https://github.com/arnaucube/circom.git
synced 2026-02-06 18:56:40 +01:00
Use native big int
This commit is contained in:
166
parser/jaz.jison
166
parser/jaz.jison
@@ -132,10 +132,8 @@ include { return 'include'; }
|
||||
|
||||
|
||||
%{
|
||||
const bigInt = require('big-integer');
|
||||
const Scalar = require('ffjavascript').Scalar;
|
||||
const util = require('util');
|
||||
const __P__ = new bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");
|
||||
const __MASK__ = new bigInt(2).pow(253).minus(1);
|
||||
|
||||
function setLines(dst, first, last) {
|
||||
last = last || first;
|
||||
@@ -266,20 +264,12 @@ identifierList
|
||||
ifStatment
|
||||
: 'if' '(' expression ')' statment 'else' statment
|
||||
{
|
||||
if ($3.type == "NUMBER") {
|
||||
$$ = !$3.value.eq(0) ? $5 : $7;
|
||||
} else {
|
||||
$$ = { type: "IF", condition: $3, then: $5, else: $7 };
|
||||
}
|
||||
$$ = { type: "IF", condition: $3, then: $5, else: $7 };
|
||||
setLines($$, @1, @7);
|
||||
}
|
||||
| 'if' '(' expression ')' statment
|
||||
{
|
||||
if ($3.type == "NUMBER") {
|
||||
$$ = !$3.value.eq(0) ? $5 : { type: "NUMBER", value: bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "IF", condition: $3, then: $5 };
|
||||
}
|
||||
$$ = { type: "IF", condition: $3, then: $5 };
|
||||
setLines($$, @1, @5);
|
||||
}
|
||||
;
|
||||
@@ -451,11 +441,7 @@ e17
|
||||
}
|
||||
| e17 '?' e17 ':' e17 %prec TERCOND
|
||||
{
|
||||
if ($1.type == "NUMBER") {
|
||||
$$ = !$1.value.eq(0) ? $3 : $5;
|
||||
} else {
|
||||
$$ = { type: "OP", op: "?", values: [$1, $3, $5] };
|
||||
}
|
||||
$$ = { type: "OP", op: "?", values: [$1, $3, $5] };
|
||||
setLines($$, @1, @5);
|
||||
}
|
||||
| e16 %prec EMPTY
|
||||
@@ -478,11 +464,7 @@ e16
|
||||
e15
|
||||
: e15 '||' e14
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: !$1.value.eq(0) || !$3.value.eq(0) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "||", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "||", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e14 %prec EMPTY
|
||||
@@ -494,11 +476,7 @@ e15
|
||||
e14
|
||||
: e14 '&&' e13
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: !$1.value.eq(0) && !$3.value.eq(0) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "&&", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "&&", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e13 %prec EMPTY
|
||||
@@ -510,11 +488,7 @@ e14
|
||||
e13
|
||||
: e13 '|' e12
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.or($3.value).and(__MASK__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "|", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "|", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e12 %prec EMPTY
|
||||
@@ -527,11 +501,7 @@ e13
|
||||
e12
|
||||
: e12 '^' e11
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.xor($3.value).and(__MASK__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "^", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "^", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e11 %prec EMPTY
|
||||
@@ -543,11 +513,7 @@ e12
|
||||
e11
|
||||
: e11 '&' e10
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.and($3.value).and(__MASK__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "&", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "&", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e10 %prec EMPTY
|
||||
@@ -562,20 +528,12 @@ e11
|
||||
e10
|
||||
: e10 '==' e9
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.equals($3.value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "==", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "==", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e10 '!=' e9
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.eq($3.value) ? bigInt(0) : bigInt(1) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "!=", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "!=", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e9 %prec EMPTY
|
||||
@@ -587,38 +545,22 @@ e10
|
||||
e9
|
||||
: e9 '<=' e7
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.lesserOrEquals($3.value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "<=", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "<=", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e9 '>=' e7
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.greaterOrEquals($3.value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: ">=", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: ">=", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e9 '<' e7
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.lesser($3.value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "<", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "<", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e9 '>' e7
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.greater($3.value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: ">", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: ">", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e7 %prec EMPTY
|
||||
@@ -630,22 +572,12 @@ e9
|
||||
e7
|
||||
: e7 '<<' e6
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
let v = $3.value.greater(256) ? 256 : $3.value.value;
|
||||
$$ = { type: "NUMBER", value: $1.value.shiftLeft(v).and(__MASK__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "<<", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "<<", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e7 '>>' e6
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
let v = $3.value.greater(256) ? 256 : $3.value.value;
|
||||
$$ = {type: "NUMBER", value: $1.value.shiftRight(v).and(__MASK__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: ">>", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: ">>", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e6 %prec EMPTY
|
||||
@@ -657,20 +589,12 @@ e7
|
||||
e6
|
||||
: e6 '+' e5
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: ($1.value.plus($3.value)).mod(__P__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "+", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "+", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e6 '-' e5
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: ($1.value.plus(__P__).minus($3.value)).mod(__P__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "-", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "-", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e5 %prec EMPTY
|
||||
@@ -683,38 +607,22 @@ e6
|
||||
e5
|
||||
: e5 '*' e4
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: ($1.value.times($3.value)).mod(__P__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "*", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "*", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e5 '/' e4
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: ($1.value.times($3.value.modInv(__P__))).mod(__P__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "/", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "/", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e5 '\\' e4
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: ($1.value.divide($3.value)) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "\\", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "\\", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e5 '%' e4
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.mod($3.value) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "%", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "%", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e4 %prec EMPTY
|
||||
@@ -726,11 +634,7 @@ e5
|
||||
e4
|
||||
: e4 '**' e3
|
||||
{
|
||||
if (($1.type == "NUMBER") && ($3.type == "NUMBER")) {
|
||||
$$ = { type: "NUMBER", value: $1.value.modPow($3.value, __P__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "**", values: [$1, $3] };
|
||||
}
|
||||
$$ = { type: "OP", op: "**", values: [$1, $3] };
|
||||
setLines($$, @1, @3);
|
||||
}
|
||||
| e3 %prec EMPTY
|
||||
@@ -758,29 +662,17 @@ e3
|
||||
}
|
||||
| '-' e3 %prec UMINUS
|
||||
{
|
||||
if ($2.type == "NUMBER") {
|
||||
$$ = { type: "NUMBER", value: __P__.minus($2.value).mod(__P__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "UMINUS", values: [$2] };
|
||||
}
|
||||
$$ = { type: "OP", op: "UMINUS", values: [$2] };
|
||||
setLines($$, @1, @2);
|
||||
}
|
||||
| '!' e3
|
||||
{
|
||||
if ($2.type == "NUMBER") {
|
||||
$$ = { type: "NUMBER", value: $2.value.eq(0) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "!", values: [$2] };
|
||||
}
|
||||
$$ = { type: "OP", op: "!", values: [$2] };
|
||||
setLines($$, @1, @2);
|
||||
}
|
||||
| '~' e3
|
||||
{
|
||||
if ($2.type == "NUMBER") {
|
||||
$$ = { type: "NUMBER", value: $2.value.xor(__MASK__) };
|
||||
} else {
|
||||
$$ = { type: "OP", op: "~", values: [$2] };
|
||||
}
|
||||
$$ = { type: "OP", op: "~", values: [$2] };
|
||||
setLines($$, @1, @2);
|
||||
}
|
||||
| e2 %prec EMPTY
|
||||
@@ -817,12 +709,12 @@ e0
|
||||
}
|
||||
| DECNUMBER
|
||||
{
|
||||
$$ = {type: "NUMBER", value: bigInt($1).mod(__P__) }
|
||||
$$ = {type: "NUMBER", value: Scalar.fromString($1) }
|
||||
setLines($$, @1);
|
||||
}
|
||||
| HEXNUMBER
|
||||
{
|
||||
$$ = {type: "NUMBER", value: bigInt($1.substr(2).toUpperCase(), 16).mod(__P__) }
|
||||
$$ = {type: "NUMBER", value: Scalar.fromString($1.substr(2).toUpperCase(), 16) }
|
||||
setLines($$, @1);
|
||||
}
|
||||
| '(' expression ')' %prec EMPTY
|
||||
|
||||
168
parser/jaz.js
168
parser/jaz.js
@@ -146,21 +146,13 @@ case 20:
|
||||
break;
|
||||
case 21:
|
||||
|
||||
if ($$[$0-4].type == "NUMBER") {
|
||||
this.$ = !$$[$0-4].value.eq(0) ? $$[$0-2] : $$[$0];
|
||||
} else {
|
||||
this.$ = { type: "IF", condition: $$[$0-4], then: $$[$0-2], else: $$[$0] };
|
||||
}
|
||||
this.$ = { type: "IF", condition: $$[$0-4], then: $$[$0-2], else: $$[$0] };
|
||||
setLines(this.$, _$[$0-6], _$[$0]);
|
||||
|
||||
break;
|
||||
case 22:
|
||||
|
||||
if ($$[$0-2].type == "NUMBER") {
|
||||
this.$ = !$$[$0-2].value.eq(0) ? $$[$0] : { type: "NUMBER", value: bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "IF", condition: $$[$0-2], then: $$[$0] };
|
||||
}
|
||||
this.$ = { type: "IF", condition: $$[$0-2], then: $$[$0] };
|
||||
setLines(this.$, _$[$0-4], _$[$0]);
|
||||
|
||||
break;
|
||||
@@ -321,11 +313,7 @@ case 50:
|
||||
break;
|
||||
case 51:
|
||||
|
||||
if ($$[$0-4].type == "NUMBER") {
|
||||
this.$ = !$$[$0-4].value.eq(0) ? $$[$0-2] : $$[$0];
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "?", values: [$$[$0-4], $$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "?", values: [$$[$0-4], $$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-4], _$[$0]);
|
||||
|
||||
break;
|
||||
@@ -336,71 +324,43 @@ case 52: case 53: case 54: case 56: case 58: case 60:
|
||||
break;
|
||||
case 55:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: !$$[$0-2].value.eq(0) || !$$[$0].value.eq(0) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "||", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "||", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 57:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: !$$[$0-2].value.eq(0) && !$$[$0].value.eq(0) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "&&", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "&&", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 59:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.or($$[$0].value).and(__MASK__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "|", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "|", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 61:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.xor($$[$0].value).and(__MASK__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "^", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "^", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 63:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.and($$[$0].value).and(__MASK__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "&", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "&", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 65:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.equals($$[$0].value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "==", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "==", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 66:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.eq($$[$0].value) ? bigInt(0) : bigInt(1) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "!=", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "!=", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
@@ -411,63 +371,37 @@ case 67: case 72:
|
||||
break;
|
||||
case 68:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.lesserOrEquals($$[$0].value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "<=", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "<=", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 69:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.greaterOrEquals($$[$0].value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: ">=", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: ">=", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 70:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.lesser($$[$0].value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "<", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "<", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 71:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.greater($$[$0].value) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: ">", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: ">", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 73:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
let v = $$[$0].value.greater(256) ? 256 : $$[$0].value.value;
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.shiftLeft(v).and(__MASK__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "<<", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "<<", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 74:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
let v = $$[$0].value.greater(256) ? 256 : $$[$0].value.value;
|
||||
this.$ = {type: "NUMBER", value: $$[$0-2].value.shiftRight(v).and(__MASK__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: ">>", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: ">>", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
@@ -478,71 +412,43 @@ case 75:
|
||||
break;
|
||||
case 76:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: ($$[$0-2].value.plus($$[$0].value)).mod(__P__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "+", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "+", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 77:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: ($$[$0-2].value.plus(__P__).minus($$[$0].value)).mod(__P__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "-", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "-", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 79:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: ($$[$0-2].value.times($$[$0].value)).mod(__P__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "*", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "*", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 80:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: ($$[$0-2].value.times($$[$0].value.modInv(__P__))).mod(__P__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "/", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "/", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 81:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: ($$[$0-2].value.divide($$[$0].value)) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "\\", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "\\", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 82:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.mod($$[$0].value) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "%", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "%", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
case 84:
|
||||
|
||||
if (($$[$0-2].type == "NUMBER") && ($$[$0].type == "NUMBER")) {
|
||||
this.$ = { type: "NUMBER", value: $$[$0-2].value.modPow($$[$0].value, __P__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "**", values: [$$[$0-2], $$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "**", values: [$$[$0-2], $$[$0]] };
|
||||
setLines(this.$, _$[$0-2], _$[$0]);
|
||||
|
||||
break;
|
||||
@@ -566,31 +472,19 @@ case 88:
|
||||
break;
|
||||
case 89:
|
||||
|
||||
if ($$[$0].type == "NUMBER") {
|
||||
this.$ = { type: "NUMBER", value: __P__.minus($$[$0].value).mod(__P__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "UMINUS", values: [$$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "UMINUS", values: [$$[$0]] };
|
||||
setLines(this.$, _$[$0-1], _$[$0]);
|
||||
|
||||
break;
|
||||
case 90:
|
||||
|
||||
if ($$[$0].type == "NUMBER") {
|
||||
this.$ = { type: "NUMBER", value: $$[$0].value.eq(0) ? bigInt(1) : bigInt(0) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "!", values: [$$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "!", values: [$$[$0]] };
|
||||
setLines(this.$, _$[$0-1], _$[$0]);
|
||||
|
||||
break;
|
||||
case 91:
|
||||
|
||||
if ($$[$0].type == "NUMBER") {
|
||||
this.$ = { type: "NUMBER", value: $$[$0].value.xor(__MASK__) };
|
||||
} else {
|
||||
this.$ = { type: "OP", op: "~", values: [$$[$0]] };
|
||||
}
|
||||
this.$ = { type: "OP", op: "~", values: [$$[$0]] };
|
||||
setLines(this.$, _$[$0-1], _$[$0]);
|
||||
|
||||
break;
|
||||
@@ -613,13 +507,13 @@ case 97: case 102: case 103:
|
||||
break;
|
||||
case 98:
|
||||
|
||||
this.$ = {type: "NUMBER", value: bigInt($$[$0]).mod(__P__) }
|
||||
this.$ = {type: "NUMBER", value: Scalar.fromString($$[$0]) }
|
||||
setLines(this.$, _$[$0]);
|
||||
|
||||
break;
|
||||
case 99:
|
||||
|
||||
this.$ = {type: "NUMBER", value: bigInt($$[$0].substr(2).toUpperCase(), 16).mod(__P__) }
|
||||
this.$ = {type: "NUMBER", value: Scalar.fromString($$[$0].substr(2).toUpperCase(), 16) }
|
||||
setLines(this.$, _$[$0]);
|
||||
|
||||
break;
|
||||
@@ -866,10 +760,8 @@ parse: function parse(input) {
|
||||
return true;
|
||||
}};
|
||||
|
||||
const bigInt = require('big-integer');
|
||||
const Scalar = require('ffjavascript').Scalar;
|
||||
const util = require('util');
|
||||
const __P__ = new bigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");
|
||||
const __MASK__ = new bigInt(2).pow(253).minus(1);
|
||||
|
||||
function setLines(dst, first, last) {
|
||||
last = last || first;
|
||||
@@ -1365,7 +1257,7 @@ case 77: console.log("INVALID: " + yy_.yytext); return 'INVALID'
|
||||
break;
|
||||
}
|
||||
},
|
||||
rules: [/^(?:\s+)/,/^(?:\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)/,/^(?:\/\/.*)/,/^(?:var\b)/,/^(?:signal\b)/,/^(?:private\b)/,/^(?:input\b)/,/^(?:output\b)/,/^(?:linearCombination\b)/,/^(?:component\b)/,/^(?:template\b)/,/^(?:function\b)/,/^(?:if\b)/,/^(?:else\b)/,/^(?:for\b)/,/^(?:while\b)/,/^(?:compute\b)/,/^(?:do\b)/,/^(?:return\b)/,/^(?:include\b)/,/^(?:0x[0-9A-Fa-f]*)/,/^(?:[0-9]+)/,/^(?:[a-zA-Z][a-zA-Z$_0-9]*)/,/^(?:"[^"]+")/,/^(?:==>)/,/^(?:<==)/,/^(?:-->)/,/^(?:<--)/,/^(?:===)/,/^(?:>>=)/,/^(?:<<=)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:==)/,/^(?:<=)/,/^(?:>=)/,/^(?:!=)/,/^(?:>>)/,/^(?:<<)/,/^(?:\*\*)/,/^(?:\+\+)/,/^(?:--)/,/^(?:\+=)/,/^(?:-=)/,/^(?:\*=)/,/^(?:\/=)/,/^(?:%=)/,/^(?:\|=)/,/^(?:&=)/,/^(?:\^=)/,/^(?:=)/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:\/)/,/^(?:\\)/,/^(?:%)/,/^(?:\^)/,/^(?:&)/,/^(?:\|)/,/^(?:!)/,/^(?:~)/,/^(?:<)/,/^(?:>)/,/^(?:!)/,/^(?:\?)/,/^(?::)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:;)/,/^(?:,)/,/^(?:\.)/,/^(?:$)/,/^(?:.)/],
|
||||
rules: [/^(?:\s+)/,/^(?:\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)/,/^(?:\/\/.*)/,/^(?:var\b)/,/^(?:signal\b)/,/^(?:private\b)/,/^(?:input\b)/,/^(?:output\b)/,/^(?:linearCombination\b)/,/^(?:component\b)/,/^(?:template\b)/,/^(?:function\b)/,/^(?:if\b)/,/^(?:else\b)/,/^(?:for\b)/,/^(?:while\b)/,/^(?:compute\b)/,/^(?:do\b)/,/^(?:return\b)/,/^(?:include\b)/,/^(?:0x[0-9A-Fa-f]*)/,/^(?:[0-9]+)/,/^(?:[a-zA-Z][a-zA-Z$_0-9]*)/,/^(?:"[^"]+")/,/^(?:==>)/,/^(?:<==)/,/^(?:-->)/,/^(?:<--)/,/^(?:===)/,/^(?:>>=)/,/^(?:<<=)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:==)/,/^(?:<=)/,/^(?:>=)/,/^(?:!=)/,/^(?:>>)/,/^(?:<<)/,/^(?:\*\*)/,/^(?:\+\+)/,/^(?:--)/,/^(?:\+=)/,/^(?:-=)/,/^(?:\*=)/,/^(?:\/=)/,/^(?:%=)/,/^(?:\|=)/,/^(?:&=)/,/^(?:\^=)/,/^(?:=)/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:\/)/,/^(?:\\)/,/^(?:%)/,/^(?:\^)/,/^(?:&)/,/^(?:\|)/,/^(?:!)/,/^(?:~)/,/^(?:<)/,/^(?:>)/,/^(?:!)/,/^(?:\?)/,/^(?::)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:;)/,/^(?:,)/,/^(?:\.)/,/^(?:$)/,/^(?:.)/],
|
||||
conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77],"inclusive":true}}
|
||||
});
|
||||
return lexer;
|
||||
|
||||
Reference in New Issue
Block a user