UNPKG

q-sharp-ts

Version:

A parser for Q# language features, implemented in TypeScript.

269 lines (268 loc) 11.2 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Token = void 0; exports.notParam = notParam; exports.lookup = lookup; exports.inverseParamLookup = inverseParamLookup; exports.inverseTypeLookup = inverseTypeLookup; var Token; (function (Token) { // Intrinsic Q# library Token[Token["AND"] = 0] = "AND"; Token[Token["CCNOT"] = 1] = "CCNOT"; Token[Token["CNOT"] = 2] = "CNOT"; Token[Token["Ex"] = 3] = "Ex"; Token[Token["H"] = 4] = "H"; Token[Token["I"] = 5] = "I"; Token[Token["M"] = 6] = "M"; Token[Token["Measure"] = 7] = "Measure"; Token[Token["R"] = 8] = "R"; Token[Token["R1"] = 9] = "R1"; Token[Token["R1Frac"] = 10] = "R1Frac"; Token[Token["Reset"] = 11] = "Reset"; Token[Token["ResetAll"] = 12] = "ResetAll"; Token[Token["RFrac"] = 13] = "RFrac"; Token[Token["Rx"] = 14] = "Rx"; Token[Token["Rxx"] = 15] = "Rxx"; Token[Token["Ry"] = 16] = "Ry"; Token[Token["Ryy"] = 17] = "Ryy"; Token[Token["Rz"] = 18] = "Rz"; Token[Token["Rzz"] = 19] = "Rzz"; Token[Token["S"] = 20] = "S"; Token[Token["SWAP"] = 21] = "SWAP"; Token[Token["T"] = 22] = "T"; Token[Token["X"] = 23] = "X"; Token[Token["Y"] = 24] = "Y"; Token[Token["Z"] = 25] = "Z"; Token[Token["ApplyUnitary"] = 26] = "ApplyUnitary"; Token[Token["Message"] = 27] = "Message"; // end intrinsic lib Token[Token["With"] = 28] = "With"; Token[Token["Assign"] = 29] = "Assign"; Token[Token["If"] = 30] = "If"; Token[Token["IfTurnary"] = 31] = "IfTurnary"; Token[Token["Elif"] = 32] = "Elif"; Token[Token["Else"] = 33] = "Else"; Token[Token["ElseTurnary"] = 34] = "ElseTurnary"; Token[Token["Plus"] = 35] = "Plus"; Token[Token["Minus"] = 36] = "Minus"; Token[Token["Times"] = 37] = "Times"; Token[Token["Divide"] = 38] = "Divide"; Token[Token["Eq"] = 39] = "Eq"; Token[Token["Neq"] = 40] = "Neq"; Token[Token["Leq"] = 41] = "Leq"; Token[Token["Geq"] = 42] = "Geq"; Token[Token["Peq"] = 43] = "Peq"; Token[Token["Meq"] = 44] = "Meq"; Token[Token["Dummy"] = 45] = "Dummy"; Token[Token["Int"] = 46] = "Int"; Token[Token["Unit"] = 47] = "Unit"; Token[Token["BigInt"] = 48] = "BigInt"; Token[Token["Double"] = 49] = "Double"; Token[Token["Bool"] = 50] = "Bool"; Token[Token["String"] = 51] = "String"; Token[Token["Qubit"] = 52] = "Qubit"; Token[Token["Result"] = 53] = "Result"; Token[Token["Pauli"] = 54] = "Pauli"; Token[Token["Range"] = 55] = "Range"; Token[Token["Array"] = 56] = "Array"; Token[Token["Tuple"] = 57] = "Tuple"; Token[Token["struct"] = 58] = "struct"; Token[Token["Operation"] = 59] = "Operation"; Token[Token["Function"] = 60] = "Function"; Token[Token["Exp"] = 61] = "Exp"; Token[Token["Period"] = 62] = "Period"; Token[Token["Comma"] = 63] = "Comma"; Token[Token["Colon"] = 64] = "Colon"; Token[Token["Quote"] = 65] = "Quote"; Token[Token["SingleQuote"] = 66] = "SingleQuote"; Token[Token["Lbrac"] = 67] = "Lbrac"; Token[Token["Rbrac"] = 68] = "Rbrac"; Token[Token["Lsqbrac"] = 69] = "Lsqbrac"; Token[Token["Rsqbrac"] = 70] = "Rsqbrac"; Token[Token["Lcurlbrac"] = 71] = "Lcurlbrac"; Token[Token["Rcurlbrac"] = 72] = "Rcurlbrac"; Token[Token["Comment"] = 73] = "Comment"; Token[Token["Identifier"] = 74] = "Identifier"; Token[Token["Or"] = 75] = "Or"; Token[Token["And"] = 76] = "And"; Token[Token["Not"] = 77] = "Not"; Token[Token["BitwiseAnd"] = 78] = "BitwiseAnd"; Token[Token["BitwiseOr"] = 79] = "BitwiseOr"; Token[Token["BitwiseNot"] = 80] = "BitwiseNot"; Token[Token["BitwiseXor"] = 81] = "BitwiseXor"; Token[Token["Let"] = 82] = "Let"; Token[Token["Mutable"] = 83] = "Mutable"; Token[Token["New"] = 84] = "New"; Token[Token["For"] = 85] = "For"; Token[Token["In"] = 86] = "In"; Token[Token["Mod"] = 87] = "Mod"; Token[Token["Unwrap"] = 88] = "Unwrap"; Token[Token["Less"] = 89] = "Less"; Token[Token["More"] = 90] = "More"; Token[Token["True"] = 91] = "True"; Token[Token["False"] = 92] = "False"; Token[Token["Left"] = 93] = "Left"; Token[Token["Right"] = 94] = "Right"; Token[Token["Continue"] = 95] = "Continue"; Token[Token["Semi"] = 96] = "Semi"; Token[Token["Import"] = 97] = "Import"; Token[Token["Use"] = 98] = "Use"; Token[Token["Borrow"] = 99] = "Borrow"; Token[Token["Adjoint"] = 100] = "Adjoint"; Token[Token["Controlled"] = 101] = "Controlled"; Token[Token["FunctionLambda"] = 102] = "FunctionLambda"; Token[Token["OperationLambda"] = 103] = "OperationLambda"; Token[Token["Return"] = 104] = "Return"; Token[Token["Fail"] = 105] = "Fail"; Token[Token["Repeat"] = 106] = "Repeat"; Token[Token["Until"] = 107] = "Until"; Token[Token["Fixup"] = 108] = "Fixup"; Token[Token["While"] = 109] = "While"; Token[Token["Within"] = 110] = "Within"; Token[Token["Apply"] = 111] = "Apply"; Token[Token["Newline"] = 112] = "Newline"; Token[Token["EndOfFile"] = 113] = "EndOfFile"; Token[Token["Illegal"] = 114] = "Illegal"; Token[Token["Zero"] = 115] = "Zero"; Token[Token["One"] = 116] = "One"; Token[Token["PauliX"] = 117] = "PauliX"; Token[Token["PauliY"] = 118] = "PauliY"; Token[Token["PauliZ"] = 119] = "PauliZ"; Token[Token["Is"] = 120] = "Is"; // begin type names Token[Token["UnitType"] = 121] = "UnitType"; Token[Token["IntType"] = 122] = "IntType"; Token[Token["BigIntType"] = 123] = "BigIntType"; Token[Token["DoubleType"] = 124] = "DoubleType"; Token[Token["BoolType"] = 125] = "BoolType"; Token[Token["StringType"] = 126] = "StringType"; Token[Token["QubitType"] = 127] = "QubitType"; Token[Token["ResultType"] = 128] = "ResultType"; Token[Token["PauliType"] = 129] = "PauliType"; Token[Token["RangeType"] = 130] = "RangeType"; Token[Token["ArrayType"] = 131] = "ArrayType"; Token[Token["TupleType"] = 132] = "TupleType"; Token[Token["StructType"] = 133] = "StructType"; Token[Token["OperationType"] = 134] = "OperationType"; Token[Token["FunctionType"] = 135] = "FunctionType"; // end type names Token[Token["Wild"] = 136] = "Wild"; })(Token || (exports.Token = Token = {})); var paramLookupMap = { '^': Token.Exp, '+': Token.Plus, '-': Token.Minus, '*': Token.Times, '/': Token.Divide, '==': Token.Eq, '+=': Token.Peq, '-=': Token.Meq, '!=': Token.Neq, '.': Token.Period, '..': Token.Range, '...': Token.Continue, 'true': Token.True, 'false': Token.False, '<=': Token.Leq, '>=': Token.Geq, 'or': Token.Or, 'and': Token.And, 'not': Token.Not, '(': Token.Lbrac, ')': Token.Rbrac, '[': Token.Lsqbrac, ']': Token.Rsqbrac, '%': Token.Mod, '!': Token.Unwrap, '&&&': Token.BitwiseAnd, '|||': Token.BitwiseOr, '~~~': Token.BitwiseNot, '^^^': Token.BitwiseXor, '<<<': Token.Left, '>>>': Token.Right, '<': Token.Less, '>': Token.More, 'Zero': Token.Zero, 'One': Token.One, 'PauliX': Token.PauliX, 'PauliY': Token.PauliY, 'PauliZ': Token.PauliZ }; var typeLookupMap = { 'Unit': Token.UnitType, 'Int': Token.IntType, 'BigInt': Token.BigIntType, 'Double': Token.DoubleType, 'Bool': Token.BoolType, 'String': Token.StringType, 'Qubit': Token.QubitType, 'Result': Token.ResultType, 'Pauli': Token.PauliType, 'Range': Token.RangeType, 'Array': Token.ArrayType, 'Tuple': Token.TupleType, 'struct': Token.StructType, 'Operation': Token.OperationType, 'Function': Token.FunctionType }; var lookupMap = __assign(__assign(__assign({}, paramLookupMap), typeLookupMap), { '?': Token.IfTurnary, '|': Token.ElseTurnary, 'if': Token.If, 'elif': Token.Elif, 'else': Token.Else, ',': Token.Comma, ':': Token.Colon, '"': Token.Quote, '\'': Token.SingleQuote, 'w\\': Token.With, '<-': Token.Assign, '->': Token.FunctionLambda, '=>': Token.OperationLambda, 'let': Token.Let, 'mutable': Token.Mutable, 'new': Token.New, 'function': Token.Function, 'operation': Token.Operation, 'import': Token.Import, 'use': Token.Use, 'borrow': Token.Borrow, 'Adjoint': Token.Adjoint, 'Controlled': Token.Controlled, 'return': Token.Return, 'fail': Token.Fail, 'for': Token.For, 'repeat': Token.Repeat, 'until': Token.Until, 'fixup': Token.Fixup, 'while': Token.While, 'in': Token.In, 'within': Token.Within, 'apply': Token.Apply, 'is': Token.Is, 'CCNOT': Token.CCNOT, 'AND': Token.AND, 'CNOT': Token.CNOT, 'Exp': Token.Ex, 'H': Token.H, 'I': Token.I, 'M': Token.M, 'Measure': Token.Measure, 'R': Token.R, 'R1': Token.R1, 'R1Frac': Token.R1Frac, 'Reset': Token.Reset, 'ResetAll': Token.ResetAll, 'RFrac': Token.RFrac, 'Rx': Token.Rx, 'Rxx': Token.Rxx, 'Ry': Token.Ry, 'Ryy': Token.Ryy, 'Rz': Token.Rz, 'Rzz': Token.Rzz, 'S': Token.S, 'SWAP': Token.SWAP, 'T': Token.T, 'X': Token.X, 'Y': Token.Y, 'Z': Token.Z, 'ApplyUnitary': Token.ApplyUnitary, 'Message': Token.Message, '_': Token.Dummy, ';': Token.Semi, '{': Token.Lcurlbrac, '}': Token.Rcurlbrac, '//': Token.Comment }); /** * Returns the token that represents a given string. * @param ident - The string. * @return The corresponding token. */ function lookup(ident) { return ident in lookupMap ? lookupMap[ident] : Token.Identifier; } /** * Returns the string representation of a parameter token. * @param tokens - The token. * @return The string representation of the token. */ function inverseParamLookup(token) { return Object.keys(paramLookupMap).find(function (ident) { return paramLookupMap[ident] == token; }); } /** * Returns the string representation of a type token. * @param tokens - The token. * @return The string representation of the token. */ function inverseTypeLookup(token) { return Object.keys(typeLookupMap).find(function (ident) { return typeLookupMap[ident] == token; }); } /** * Determines whether a token denotes a parameter. * @param tokens - The token. * @return Whether the token does NOT denote a parameter. */ function notParam(token) { return (Object.keys(paramLookupMap).map(function (key) { return paramLookupMap[key]; }).indexOf(token) == -1) && token != Token.Int && token != Token.Unit && token != Token.BigInt && token != Token.Double && token != Token.Bool && token != Token.String && token != Token.Qubit && token != Token.Result && token != Token.Pauli && token != Token.Range && token != Token.Array && token != Token.Tuple && token != Token.struct && token != Token.Operation && token != Token.Function && token && token != Token.Identifier; }