# # # The Nimrod Compiler # (c) Copyright 2011 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. import hashes, strutils, idents # Keywords must be kept sorted and within a range type TSpecialWord* = enum wInvalid, wAddr, wAnd, wAs, wAsm, wAtomic, wBind, wBlock, wBreak, wCase, wCast, wConst, wContinue, wConverter, wDiscard, wDistinct, wDiv, wElif, wElse, wEnd, wEnum, wExcept, wFinally, wFor, wFrom, wGeneric, wIf, wImplies, wImport, wIn, wInclude, wIs, wIsnot, wIterator, wLambda, wLet, wMacro, wMethod, wMod, wNil, wNot, wNotin, wObject, wOf, wOr, wOut, wProc, wPtr, wRaise, wRef, wReturn, wShl, wShr, wTemplate, wTry, wTuple, wType, wVar, wWhen, wWhile, wWith, wWithout, wXor, wYield, wColon, wColonColon, wEquals, wDot, wDotDot, wStar, wMinus, wMagic, wThread, wFinal, wProfiler, wObjChecks, wImportCompilerProc, wImportc, wExportc, wExtern, wAlign, wNodecl, wPure, wVolatile, wRegister, wSideeffect, wHeader, wNosideeffect, wNoreturn, wMerge, wLib, wDynlib, wCompilerproc, wProcVar, wFatal, wError, wWarning, wHint, wLine, wPush, wPop, wDefine, wUndef, wLinedir, wStacktrace, wLinetrace, wParallelBuild, wLink, wCompile, wLinksys, wDeprecated, wVarargs, wByref, wCallconv, wBreakpoint, wDebugger, wNimcall, wStdcall, wCdecl, wSafecall, wSyscall, wInline, wNoInline, wFastcall, wClosure, wNoconv, wOn, wOff, wChecks, wRangechecks, wBoundchecks, wOverflowchecks, wNilchecks, wFloatchecks, wNanChecks, wInfChecks, wAssertions, wWarnings, wW, wHints, wOptimization, wSpeed, wSize, wNone, wPath, wP, wD, wU, wDebuginfo, wCompileonly, wNolinking, wForcebuild, wF, wDeadCodeElim, wSafecode, wPragma, wCompileTime, wGc, wRefc, wBoehm, wA, wOpt, wO, wApp, wConsole, wGui, wPassc, wT, wPassl, wL, wListcmd, wGendoc, wGenmapping, wOs, wCpu, wGenerate, wG, wC, wCpp, wBorrow, wRun, wR, wVerbosity, wV, wHelp, wH, wSymbolFiles, wFieldChecks, wX, wVersion, wAdvanced, wSkipcfg, wSkipProjCfg, wCc, wGenscript, wCheckPoint, wThreadAnalysis, wNoMain, wSubsChar, wAcyclic, wShallow, wUnroll, wLinearScanEnd, wIndex, wWrite, wPutEnv, wPrependEnv, wAppendEnv, wThreadVar, wEmit, wThreads, wRecursivePath, wStdout, wIdeTools, wSuggest, wTrack, wDef, wContext TSpecialWords* = set[TSpecialWord] const oprLow* = ord(wColon) oprHigh* = ord(wDotDot) specialWords*: array[low(TSpecialWord)..high(TSpecialWord), string] = ["", "addr", "and", "as", "asm", "atomic", "bind", "block", "break", "case", "cast", "const", "continue", "converter", "discard", "distinct", "div", "elif", "else", "end", "enum", "except", "finally", "for", "from", "generic", "if", "implies", "import", "in", "include", "is", "isnot", "iterator", "lambda", "let", "macro", "method", "mod", "nil", "not", "notin", "object", "of", "or", "out", "proc", "ptr", "raise", "ref", "return", "shl", "shr", "template", "try", "tuple", "type", "var", "when", "while", "with", "without", "xor", "yield", ":", "::", "=", ".", "..", "*", "-", "magic", "thread", "final", "profiler", "objchecks", "importcompilerproc", "importc", "exportc", "extern", "align", "nodecl", "pure", "volatile", "register", "sideeffect", "header", "nosideeffect", "noreturn", "merge", "lib", "dynlib", "compilerproc", "procvar", "fatal", "error", "warning", "hint", "line", "push", "pop", "define", "undef", "linedir", "stacktrace", "linetrace", "parallelbuild", "link", "compile", "linksys", "deprecated", "varargs", "byref", "callconv", "breakpoint", "debugger", "nimcall", "stdcall", "cdecl", "safecall", "syscall", "inline", "noinline", "fastcall", "closure", "noconv", "on", "off", "checks", "rangechecks", "boundchecks", "overflowchecks", "nilchecks", "floatchecks", "nanchecks", "infchecks", "assertions", "warnings", "w", "hints", "optimization", "speed", "size", "none", "path", "p", "d", "u", "debuginfo", "compileonly", "nolinking", "forcebuild", "f", "deadcodeelim", "safecode", "pragma", "compiletime", "gc", "refc", "boehm", "a", "opt", "o", "app", "console", "gui", "passc", "t", "passl", "l", "listcmd", "gendoc", "genmapping", "os", "cpu", "generate", "g", "c", "cpp", "borrow", "run", "r", "verbosity", "v", "help", "h", "symbolfiles", "fieldchecks", "x", "version", "advanced", "skipcfg", "skipprojcfg", "cc", "genscript", "checkpoint", "threadanalysis", "nomain", "subschar", "acyclic", "shallow", "unroll", "linearscanend", "index", "write", "putenv", "prependenv", "appendenv", "threadvar", "emit", "threads", "recursivepath", "stdout", "idetools", "suggest", "track", "def", "context"] proc findStr*(a: openarray[string], s: string): int = for i in countup(low(a), high(a)): if cmpIgnoreStyle(a[i], s) == 0: return i result = - 1 proc whichKeyword*(id: PIdent): TSpecialWord = if id.id < 0: result = wInvalid else: result = TSpecialWord(id.id) proc whichKeyword*(id: String): TSpecialWord = result = whichKeyword(getIdent(id)) proc initSpecials() = # initialize the keywords: for s in countup(succ(low(specialWords)), high(specialWords)): getIdent(specialWords[s], hashIgnoreStyle(specialWords[s])).id = ord(s) initSpecials()