/* Copyright 2018 0KIMS association. This file is part of circom (Zero Knowledge Circuit Compiler). circom is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. circom is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with circom. If not, see . */ const bigInt = require("big-integer"); module.exports = gen; function ident(text) { let lines = text.split("\n"); for (let i=0; i>") { return genShr(ctx, ast); } else if (ast.op == "<") { return genLt(ctx, ast); } else if (ast.op == ">") { return genGt(ctx, ast); } else if (ast.op == "<=") { return genLte(ctx, ast); } else if (ast.op == ">=") { return genGte(ctx, ast); } else if (ast.op == "==") { return genEq(ctx, ast); } else if (ast.op == "!=") { return genNeq(ctx, ast); } else if (ast.op == "?") { return genTerCon(ctx, ast); } else { error(ctx, ast, "Invalid operation: " + ast.op); } } else if (ast.type == "DECLARE") { if (ast.declareType == "COMPONENT") { return genDeclareComponent(ctx, ast); } else if ((ast.declareType == "SIGNALIN")|| (ast.declareType == "SIGNALOUT")|| (ast.declareType == "SIGNAL")) { return genDeclareSignal(ctx, ast); } else if (ast.declareType == "VARIABLE") { return genDeclareVariable(ctx, ast); } else { error(ctx, ast, "Invalid declaration: " + ast.declareType); } } else if (ast.type == "FUNCTIONCALL") { return genFunctionCall(ctx, ast); } else if (ast.type == "BLOCK") { return genBlock(ctx, ast); } else if (ast.type == "FOR") { return genFor(ctx, ast); } else if (ast.type == "WHILE") { return genWhile(ctx, ast); } else if (ast.type == "IF") { return genIf(ctx, ast); } else if (ast.type == "RETURN") { return genReturn(ctx, ast); } else if (ast.type == "TEMPLATEDEF") { return genTemplateDef(ctx, ast); } else if (ast.type == "FUNCTIONDEF") { return genFunctionDef(ctx, ast); } else if (ast.type == "INCLUDE") { return genInclude(ctx, ast); } else if (ast.type == "ARRAY") { return genArray(ctx, ast); } else { error(ctx, ast, "GEN -> Invalid AST node type: " + ast.type); } } function error(ctx, ast, errStr) { ctx.error = { pos: { first_line: ast.first_line, first_column: ast.first_column, last_line: ast.last_line, last_column: ast.last_column }, errStr: errStr, ast: ast }; } function getScope(ctx, name) { for (let i=ctx.scopes.length-1; i>=0; i--) { if (ctx.scopes[i][name]) return ctx.scopes[i][name]; } return null; } function genFunctionCall(ctx, ast) { let S = "["; for (let i=0; i0) S += ","; S += gen(ctx, ast.params[i]); } S+="]"; return `ctx.callFunction("${ast.name}", ${S})`; } function genBlock(ctx, ast) { let body = ""; for (let i=0; i0) S += ","; S += gen(ctx, ast.values[i]); } S+="]"; return S; }