summary refs log tree commit diff stats
path: root/rod
diff options
context:
space:
mode:
Diffstat (limited to 'rod')
-rwxr-xr-xrod/options.nim2
-rwxr-xr-xrod/pbraces.nim27
-rwxr-xr-xrod/pnimsyn.nim27
-rwxr-xr-xrod/rnimsyn.nim2
-rwxr-xr-xrod/scanner.nim21
5 files changed, 50 insertions, 29 deletions
diff --git a/rod/options.nim b/rod/options.nim
index 1503770c3..16ff536bd 100755
--- a/rod/options.nim
+++ b/rod/options.nim
@@ -128,7 +128,7 @@ proc addImplicitMod(filename: string) =
   gImplicitMods[length] = filename
 
 proc getPrefixDir(): string = 
-  result = SplitPath(getApplicationDir()).head
+  result = SplitPath(getAppDir()).head
 
 proc shortenDir(dir: string): string = 
   # returns the interesting part of a dir
diff --git a/rod/pbraces.nim b/rod/pbraces.nim
index 4a5f85b85..dc1ddb292 100755
--- a/rod/pbraces.nim
+++ b/rod/pbraces.nim
@@ -163,12 +163,28 @@ proc parseAddr(p: var TParser): PNode =
   addSon(result, parseExpr(p))
   optPar(p)
   eat(p, tkParRi)
+  
+proc parseGStrLit(p: var TParser, a: PNode): PNode = 
+  case p.tok.tokType
+  of tkGStrLit: 
+    result = newNodeP(nkCallStrLit, p)
+    addSon(result, a)
+    addSon(result, newStrNodeP(nkRStrLit, p.tok.literal, p))
+    getTok(p)
+  of tkGTripleStrLit: 
+    result = newNodeP(nkCallStrLit, p)
+    addSon(result, a)
+    addSon(result, newStrNodeP(nkTripleStrLit, p.tok.literal, p))
+    getTok(p)
+  else:
+    result = a
 
 proc identOrLiteral(p: var TParser): PNode = 
   case p.tok.tokType
   of tkSymbol: 
     result = newIdentNodeP(p.tok.ident, p)
     getTok(p)
+    result = parseGStrLit(p, result)
   of tkAccent: 
     result = accExpr(p)       # literals
   of tkIntLit: 
@@ -212,16 +228,6 @@ proc identOrLiteral(p: var TParser): PNode =
   of tkTripleStrLit: 
     result = newStrNodeP(nkTripleStrLit, p.tok.literal, p)
     getTok(p)
-  of tkCallRStrLit: 
-    result = newNodeP(nkCallStrLit, p)
-    addSon(result, newIdentNodeP(p.tok.ident, p))
-    addSon(result, newStrNodeP(nkRStrLit, p.tok.literal, p))
-    getTok(p)
-  of tkCallTripleStrLit: 
-    result = newNodeP(nkCallStrLit, p)
-    addSon(result, newIdentNodeP(p.tok.ident, p))
-    addSon(result, newStrNodeP(nkTripleStrLit, p.tok.literal, p))
-    getTok(p)
   of tkCharLit: 
     result = newIntNodeP(nkCharLit, ord(p.tok.literal[0]), p)
     getTok(p)
@@ -279,6 +285,7 @@ proc primary(p: var TParser): PNode =
       getTok(p)               # skip '.'
       optInd(p, result)
       addSon(result, parseSymbol(p))
+      result = parseGStrLit(p, result)
     of tkHat: 
       a = result
       result = newNodeP(nkDerefExpr, p)
diff --git a/rod/pnimsyn.nim b/rod/pnimsyn.nim
index fe80fe0c4..113f47d34 100755
--- a/rod/pnimsyn.nim
+++ b/rod/pnimsyn.nim
@@ -394,11 +394,27 @@ proc setBaseFlags(n: PNode, base: TNumericalBase) =
   of base8: incl(n.flags, nfBase8)
   of base16: incl(n.flags, nfBase16)
   
+proc parseGStrLit(p: var TParser, a: PNode): PNode = 
+  case p.tok.tokType
+  of tkGStrLit: 
+    result = newNodeP(nkCallStrLit, p)
+    addSon(result, a)
+    addSon(result, newStrNodeP(nkRStrLit, p.tok.literal, p))
+    getTok(p)
+  of tkGTripleStrLit: 
+    result = newNodeP(nkCallStrLit, p)
+    addSon(result, a)
+    addSon(result, newStrNodeP(nkTripleStrLit, p.tok.literal, p))
+    getTok(p)
+  else:
+    result = a
+  
 proc identOrLiteral(p: var TParser): PNode = 
   case p.tok.tokType
   of tkSymbol: 
     result = newIdentNodeP(p.tok.ident, p)
     getTok(p)
+    result = parseGStrLit(p, result)
   of tkAccent: 
     result = accExpr(p)       # literals
   of tkIntLit: 
@@ -442,16 +458,6 @@ proc identOrLiteral(p: var TParser): PNode =
   of tkTripleStrLit: 
     result = newStrNodeP(nkTripleStrLit, p.tok.literal, p)
     getTok(p)
-  of tkCallRStrLit: 
-    result = newNodeP(nkCallStrLit, p)
-    addSon(result, newIdentNodeP(p.tok.ident, p))
-    addSon(result, newStrNodeP(nkRStrLit, p.tok.literal, p))
-    getTok(p)
-  of tkCallTripleStrLit: 
-    result = newNodeP(nkCallStrLit, p)
-    addSon(result, newIdentNodeP(p.tok.ident, p))
-    addSon(result, newStrNodeP(nkTripleStrLit, p.tok.literal, p))
-    getTok(p)
   of tkCharLit: 
     result = newIntNodeP(nkCharLit, ord(p.tok.literal[0]), p)
     getTok(p)
@@ -509,6 +515,7 @@ proc primary(p: var TParser): PNode =
       getTok(p)               # skip '.'
       optInd(p, result)
       addSon(result, parseSymbol(p))
+      result = parseGStrLit(p, result)
     of tkHat: 
       a = result
       result = newNodeP(nkDerefExpr, p)
diff --git a/rod/rnimsyn.nim b/rod/rnimsyn.nim
index d0c7dc9e3..9424c4519 100755
--- a/rod/rnimsyn.nim
+++ b/rod/rnimsyn.nim
@@ -684,7 +684,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
     if n.sons[1].kind == nkRStrLit: 
       put(g, tkRStrLit, '\"' & replace(n[1].strVal, "\"", "\"\"") & '\"')
     else: 
-      gsub(g, n.sons[0])
+      gsub(g, n.sons[1])
   of nkHiddenStdConv, nkHiddenSubConv, nkHiddenCallConv: gsub(g, n.sons[0])
   of nkCast: 
     put(g, tkCast, "cast")
diff --git a/rod/scanner.nim b/rod/scanner.nim
index 348c5c73d..f40b8769d 100755
--- a/rod/scanner.nim
+++ b/rod/scanner.nim
@@ -58,7 +58,7 @@ type
     tkYield, #[[[end]]]
     tkIntLit, tkInt8Lit, tkInt16Lit, tkInt32Lit, tkInt64Lit, tkFloatLit, 
     tkFloat32Lit, tkFloat64Lit, tkStrLit, tkRStrLit, tkTripleStrLit, 
-    tkCallRStrLit, tkCallTripleStrLit, tkCharLit, tkParLe, tkParRi, tkBracketLe, 
+    tkGStrLit, tkGTripleStrLit, tkCharLit, tkParLe, tkParRi, tkBracketLe, 
     tkBracketRi, tkCurlyLe, tkCurlyRi, 
     tkBracketDotLe, tkBracketDotRi, # [. and  .]
     tkCurlyDotLe, tkCurlyDotRi, # {.  and  .}
@@ -91,7 +91,7 @@ const
     "yield", #[[[end]]]
     "tkIntLit", "tkInt8Lit", "tkInt16Lit", "tkInt32Lit", "tkInt64Lit", 
     "tkFloatLit", "tkFloat32Lit", "tkFloat64Lit", "tkStrLit", "tkRStrLit", 
-    "tkTripleStrLit", "tkCallRStrLit", "tkCallTripleStrLit", "tkCharLit", "(", 
+    "tkTripleStrLit", "tkGStrLit", "tkGTripleStrLit", "tkCharLit", "(", 
     ")", "[", "]", "{", "}", "[.", ".]", "{.", ".}", "(.", ".)", ",", ";", ":", 
     "=", ".", "..", "^", "tkOpr", "tkComment", "`", "[new indentation]", 
     "[same indentation]", "[dedentation]", "tkSpaces", "tkInfixOpr", 
@@ -587,10 +587,11 @@ proc getSymbol(L: var TLexer, tok: var TToken) =
     tok.tokType = tkSymbol
   else: 
     tok.tokType = TTokType(tok.ident.id + ord(tkSymbol))
-  if buf[pos] == '\"': 
-    getString(L, tok, true)
-    if tok.tokType == tkRStrLit: tok.tokType = tkCallRStrLit
-    else: tok.tokType = tkCallTripleStrLit
+  when false:
+    if buf[pos] == '\"': 
+      getString(L, tok, true)
+      if tok.tokType == tkRStrLit: tok.tokType = tkCallRStrLit
+      else: tok.tokType = tkCallTripleStrLit
   
 proc getOperator(L: var TLexer, tok: var TToken) = 
   var pos = L.bufpos
@@ -770,7 +771,13 @@ proc rawGetTok(L: var TLexer, tok: var TToken) =
       tok.tokType = tkAccent
       Inc(L.bufpos)
     of '\"': 
-      getString(L, tok, false)
+      # check for extended raw string literal:
+      var rawMode = L.bufpos > 0 and L.buf[L.bufpos-1] in SymChars
+      getString(L, tok, rawMode)
+      if rawMode:
+        # tkRStrLit -> tkGStrLit
+        # tkTripleStrLit -> tkGTripleStrLit
+        inc(tok.tokType, 2)
     of '\'':
       tok.tokType = tkCharLit
       getCharacter(L, tok)