123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- #
- #
- # The Nim Compiler
- # (c) Copyright 2015 Andreas Rumpf
- #
- # See the file "copying.txt", included in this
- # distribution, for details about the copyright.
- #
- # This module contains a word recognizer, i.e. a simple
- # procedure which maps special words to an enumeration.
- # It is primarily needed because Pascal's case statement
- # does not support strings. Without this the code would
- # be slow and unreadable.
- from strutils import cmpIgnoreStyle
- # Keywords must be kept sorted and within a range
- type
- TSpecialWord* = enum
- wInvalid,
- wAddr, wAnd, wAs, wAsm,
- wBind, wBlock, wBreak, wCase, wCast, wConcept, wConst,
- wContinue, wConverter, wDefer, wDiscard, wDistinct, wDiv, wDo,
- wElif, wElse, wEnd, wEnum, wExcept, wExport,
- wFinally, wFor, wFrom, wFunc, wIf, wImport, wIn,
- wInclude, wInterface, wIs, wIsnot, wIterator, wLet,
- wMacro, wMethod, wMixin, wMod, wNil,
- wNot, wNotin, wObject, wOf, wOr, wOut, wProc, wPtr, wRaise, wRef, wReturn,
- wShl, wShr, wStatic, wTemplate, wTry, wTuple, wType, wUsing, wVar,
- wWhen, wWhile, wXor, wYield,
- wColon, wColonColon, wEquals, wDot, wDotDot,
- wStar, wMinus,
- wMagic, wThread, wFinal, wProfiler, wMemTracker, wObjChecks,
- wIntDefine, wStrDefine, wBoolDefine, wCursor,
- wImmediate, wConstructor, wDestructor, wDelegator, wOverride,
- wImportCpp, wImportObjC,
- wImportCompilerProc,
- wImportc, wImportJs, wExportc, wExportCpp, wExportNims,
- wIncompleteStruct, # deprecated
- wCompleteStruct,
- wRequiresInit,
- wAlign, wNodecl, wPure, wSideEffect, wHeader,
- wNoSideEffect, wGcSafe, wNoreturn, wNosinks, wMerge, wLib, wDynlib,
- wCompilerProc, wCore, wProcVar, wBase, wUsed,
- wFatal, wError, wWarning, wHint, wWarningAsError, wLine, wPush, wPop, wDefine, wUndef,
- wLineDir, wStackTrace, wLineTrace, wLink, wCompile,
- wLinksys, wDeprecated, wVarargs, wCallconv, wDebugger,
- wNimcall, wStdcall, wCdecl, wSafecall, wSyscall, wInline, wNoInline,
- wFastcall, wThiscall, wClosure, wNoconv, wOn, wOff, wChecks, wRangeChecks,
- wBoundChecks, wOverflowChecks, wNilChecks,
- wFloatChecks, wNanChecks, wInfChecks, wStyleChecks, wStaticBoundchecks,
- wNonReloadable, wExecuteOnReload,
- wAssertions, wPatterns, wTrMacros, wSinkInference, wWarnings,
- wHints, wOptimization, wRaises, wWrites, wReads, wSize, wEffects, wTags,
- wRequires, wEnsures, wInvariant, wAssume, wAssert,
- wDeadCodeElimUnused, # deprecated, dead code elim always happens
- wSafecode, wPackage, wNoForward, wReorder, wNoRewrite, wNoDestroy,
- wPragma,
- wCompileTime, wNoInit,
- wPassc, wPassl, wLocalPassc, wBorrow, wDiscardable,
- wFieldChecks,
- wSubsChar, wAcyclic, wShallow, wUnroll, wLinearScanEnd, wComputedGoto,
- wInjectStmt, wExperimental,
- wWrite, wGensym, wInject, wDirty, wInheritable, wThreadVar, wEmit,
- wAsmNoStackFrame,
- wImplicitStatic, wGlobal, wCodegenDecl, wUnchecked, wGuard, wLocks,
- wPartial, wExplain, wLiftLocals,
- wAuto, wBool, wCatch, wChar, wClass, wCompl
- wConst_cast, wDefault, wDelete, wDouble, wDynamic_cast,
- wExplicit, wExtern, wFalse, wFloat, wFriend,
- wGoto, wInt, wLong, wMutable, wNamespace, wNew, wOperator,
- wPrivate, wProtected, wPublic, wRegister, wReinterpret_cast, wRestrict,
- wShort, wSigned, wSizeof, wStatic_cast, wStruct, wSwitch,
- wThis, wThrow, wTrue, wTypedef, wTypeid, wTypeof, wTypename,
- wUnion, wPacked, wUnsigned, wVirtual, wVoid, wVolatile, wWchar_t,
- wAlignas, wAlignof, wConstexpr, wDecltype, wNullptr, wNoexcept,
- wThread_local, wStatic_assert, wChar16_t, wChar32_t,
- wStdIn, wStdOut, wStdErr,
- wInOut, wByCopy, wByRef, wOneWay,
- wBitsize
- TSpecialWords* = set[TSpecialWord]
- const
- oprLow* = ord(wColon)
- oprHigh* = ord(wDotDot)
- nimKeywordsLow* = ord(wAsm)
- nimKeywordsHigh* = ord(wYield)
- ccgKeywordsLow* = ord(wAuto)
- ccgKeywordsHigh* = ord(wOneWay)
- cppNimSharedKeywords* = {
- wAsm, wBreak, wCase, wConst, wContinue, wDo, wElse, wEnum, wExport,
- wFor, wIf, wReturn, wStatic, wTemplate, wTry, wWhile, wUsing}
- specialWords*: array[low(TSpecialWord)..high(TSpecialWord), string] = ["",
- "addr", "and", "as", "asm",
- "bind", "block", "break", "case", "cast",
- "concept", "const", "continue", "converter",
- "defer", "discard", "distinct", "div", "do",
- "elif", "else", "end", "enum", "except", "export",
- "finally", "for", "from", "func", "if",
- "import", "in", "include", "interface", "is", "isnot", "iterator",
- "let",
- "macro", "method", "mixin", "mod", "nil", "not", "notin",
- "object", "of", "or",
- "out", "proc", "ptr", "raise", "ref", "return",
- "shl", "shr", "static",
- "template", "try", "tuple", "type", "using", "var",
- "when", "while", "xor",
- "yield",
- ":", "::", "=", ".", "..",
- "*", "-",
- "magic", "thread", "final", "profiler", "memtracker", "objchecks",
- "intdefine", "strdefine", "booldefine", "cursor",
- "immediate", "constructor", "destructor", "delegator", "override",
- "importcpp", "importobjc",
- "importcompilerproc", "importc", "importjs", "exportc", "exportcpp", "exportnims",
- "incompletestruct",
- "completestruct",
- "requiresinit", "align", "nodecl", "pure", "sideeffect",
- "header", "nosideeffect", "gcsafe", "noreturn", "nosinks", "merge", "lib", "dynlib",
- "compilerproc", "core", "procvar", "base", "used",
- "fatal", "error", "warning", "hint", "warningaserror", "line",
- "push", "pop", "define", "undef", "linedir", "stacktrace", "linetrace",
- "link", "compile", "linksys", "deprecated", "varargs",
- "callconv", "debugger", "nimcall", "stdcall",
- "cdecl", "safecall", "syscall", "inline", "noinline", "fastcall", "thiscall", "closure",
- "noconv", "on", "off", "checks", "rangechecks", "boundchecks",
- "overflowchecks", "nilchecks",
- "floatchecks", "nanchecks", "infchecks", "stylechecks", "staticboundchecks",
- "nonreloadable", "executeonreload",
- "assertions", "patterns", "trmacros", "sinkinference", "warnings", "hints",
- "optimization", "raises", "writes", "reads", "size", "effects", "tags",
- "requires", "ensures", "invariant", "assume", "assert",
- "deadcodeelim", # deprecated, dead code elim always happens
- "safecode", "package", "noforward", "reorder", "norewrite", "nodestroy",
- "pragma",
- "compiletime", "noinit",
- "passc", "passl", "localpassc", "borrow", "discardable", "fieldchecks",
- "subschar", "acyclic", "shallow", "unroll", "linearscanend",
- "computedgoto", "injectstmt", "experimental",
- "write", "gensym", "inject", "dirty", "inheritable", "threadvar", "emit",
- "asmnostackframe", "implicitstatic", "global", "codegendecl", "unchecked",
- "guard", "locks", "partial", "explain", "liftlocals",
- "auto", "bool", "catch", "char", "class", "compl",
- "const_cast", "default", "delete", "double",
- "dynamic_cast", "explicit", "extern", "false",
- "float", "friend", "goto", "int", "long", "mutable",
- "namespace", "new", "operator",
- "private", "protected", "public", "register", "reinterpret_cast", "restrict",
- "short", "signed", "sizeof", "static_cast", "struct", "switch",
- "this", "throw", "true", "typedef", "typeid", "typeof",
- "typename", "union", "packed", "unsigned", "virtual", "void", "volatile",
- "wchar_t",
- "alignas", "alignof", "constexpr", "decltype", "nullptr", "noexcept",
- "thread_local", "static_assert", "char16_t", "char32_t",
- "stdin", "stdout", "stderr",
- "inout", "bycopy", "byref", "oneway",
- "bitsize"
- ]
- proc findStr*(a: openArray[string], s: string): int =
- for i in low(a)..high(a):
- if cmpIgnoreStyle(a[i], s) == 0:
- return i
- result = - 1
- proc canonPragmaSpelling*(w: TSpecialWord): string =
- case w
- of wNoSideEffect: "noSideEffect"
- of wImportCompilerProc: "importCompilerProc"
- of wIncompleteStruct: "incompleteStruct"
- of wCompleteStruct: "completeStruct"
- of wRequiresInit: "requiresInit"
- of wSideEffect: "sideEffect"
- of wLineDir: "lineDir"
- of wStackTrace: "stackTrace"
- of wLineTrace: "lineTrace"
- of wRangeChecks: "rangeChecks"
- of wBoundChecks: "boundChecks"
- of wOverflowChecks: "overflowChecks"
- of wNilChecks: "nilChecks"
- of wFloatChecks: "floatChecks"
- of wNanChecks: "nanChecks"
- of wInfChecks: "infChecks"
- of wStyleChecks: "styleChecks"
- of wNonReloadable: "nonReloadable"
- of wExecuteOnReload: "executeOnReload"
- of wDeadCodeElimUnused: "deadCodeElim"
- of wCompileTime: "compileTime"
- of wFieldChecks: "fieldChecks"
- of wLinearScanEnd: "linearScanEnd"
- of wComputedGoto: "computedGoto"
- of wInjectStmt: "injectStmt"
- of wAsmNoStackFrame: "asmNoStackFrame"
- of wImplicitStatic: "implicitStatic"
- of wCodegenDecl: "codegenDecl"
- of wLiftLocals: "liftLocals"
- of wLocalPassc: "localPassc"
- of wWarningAsError: "warningAsError"
- else: specialWords[w]
|