From d7a472743b6d3e7c0062621d0b861d20edf89663 Mon Sep 17 00:00:00 2001 From: Araq Date: Thu, 10 Sep 2015 08:53:58 +0200 Subject: [PATCH] fixes #2559 --- compiler/syntaxes.nim | 7 ++++++- doc/filelist.txt | 4 ++-- doc/filters.txt | 13 +++++++------ doc/manual/syntax.txt | 8 ++++---- tools/website.tmpl | 10 +++++----- web/news.txt | 2 ++ 6 files changed, 26 insertions(+), 18 deletions(-) diff --git a/compiler/syntaxes.nim b/compiler/syntaxes.nim index 91cfdbefd..021910544 100644 --- a/compiler/syntaxes.nim +++ b/compiler/syntaxes.nim @@ -92,10 +92,15 @@ proc parsePipe(filename: string, inputStream: PLLStream): PNode = var line = newStringOfCap(80) discard llStreamReadLine(s, line) var i = utf8Bom(line) + var linenumber = 1 if containsShebang(line, i): discard llStreamReadLine(s, line) i = 0 - if line[i] == '#' and line[i+1] == '!': + inc linenumber + if line[i] == '#' and line[i+1] in {'?', '!'}: + if line[i+1] == '!': + message(newLineInfo(filename, linenumber, 1), + warnDeprecated, "use '#?' instead; '#!'") inc(i, 2) while line[i] in Whitespace: inc(i) var q: TParser diff --git a/doc/filelist.txt b/doc/filelist.txt index beff8f6c8..71379b40d 100644 --- a/doc/filelist.txt +++ b/doc/filelist.txt @@ -4,12 +4,12 @@ Short description of Nim's modules ============== ========================================================== Module Description ============== ========================================================== -nim main module: parses the command line and calls +nim main module: parses the command line and calls ``main.MainCommand`` main implements the top-level command dispatching nimconf implements the config file reader syntaxes dispatcher for the different parsers and filters -filter_tmpl standard template filter (``#! stdtempl``) +filter_tmpl standard template filter (``#? stdtempl``) lexbase buffer handling of the lexical analyser lexer lexical analyser parser Nim's parser diff --git a/doc/filters.txt b/doc/filters.txt index afbd61e3c..46bc6c3e5 100644 --- a/doc/filters.txt +++ b/doc/filters.txt @@ -8,9 +8,9 @@ A `Source Code Filter` transforms the input character stream to an in-memory output stream before parsing. A filter can be used to provide templating systems or preprocessors. -To use a filter for a source file the *shebang* notation is used:: +To use a filter for a source file the ``#?`` notation is used:: - #! stdtmpl(subsChar = '$', metaChar = '#') + #? stdtmpl(subsChar = '$', metaChar = '#') #proc generateXML(name, age: string): string = # result = "" @@ -20,7 +20,8 @@ To use a filter for a source file the *shebang* notation is used:: As the example shows, passing arguments to a filter can be done just like an ordinary procedure call with named or positional arguments. The -available parameters depend on the invoked filter. +available parameters depend on the invoked filter. Before version 0.12.0 of +the language ``#!`` was used instead of ``#?``. Pipe operator @@ -28,7 +29,7 @@ Pipe operator Filters can be combined with the ``|`` pipe operator:: - #! strip(startswith="<") | stdtmpl + #? strip(startswith="<") | stdtmpl #proc generateXML(name, age: string): string = # result = "" @@ -104,7 +105,7 @@ Parameters and their defaults: Example:: - #! stdtmpl | standard + #? stdtmpl | standard #proc generateHTMLPage(title, currentTab, content: string, # tabs: openArray[string]): string = # result = "" @@ -172,7 +173,7 @@ produces ``$``. The template engine is quite flexible. It is easy to produce a procedure that writes the template code directly to a file:: - #! stdtmpl(emit="f.write") | standard + #? stdtmpl(emit="f.write") | standard #proc writeHTMLPage(f: File, title, currentTab, content: string, # tabs: openArray[string]) = $title diff --git a/doc/manual/syntax.txt b/doc/manual/syntax.txt index 99af15948..c444a3995 100644 --- a/doc/manual/syntax.txt +++ b/doc/manual/syntax.txt @@ -68,13 +68,13 @@ Strong spaces ------------- The number of spaces preceding a non-keyword operator affects precedence -if the experimental parser directive ``#!strongSpaces`` is used. Indentation +if the experimental parser directive ``#?strongSpaces`` is used. Indentation is not used to determine the number of spaces. If 2 or more operators have the same number of preceding spaces the precedence table applies, so ``1 + 3 * 4`` is still parsed as ``1 + (3 * 4)``, but ``1+3 * 4`` is parsed as ``(1+3) * 4``: .. code-block:: nim - #! strongSpaces + #? strongSpaces if foo+4 * 4 == 8 and b&c | 9 ++ bar: echo "" @@ -86,7 +86,7 @@ Furthermore whether an operator is used a prefix operator is affected by the number of spaces: .. code-block:: nim - #! strongSpaces + #? strongSpaces echo $foo # is parsed as echo($foo) @@ -95,7 +95,7 @@ This also affects whether ``[]``, ``{}``, ``()`` are parsed as constructors or as accessors: .. code-block:: nim - #! strongSpaces + #? strongSpaces echo (1,2) # is parsed as echo((1,2)) diff --git a/tools/website.tmpl b/tools/website.tmpl index bc3ed8e2c..3209aac51 100644 --- a/tools/website.tmpl +++ b/tools/website.tmpl @@ -1,5 +1,5 @@ -#! stdtmpl | standard -#proc generateHTMLPage(c: var TConfigData, currentTab, content, rss: string): string = +#? stdtmpl | standard +#proc generateHTMLPage(c: var TConfigData, currentTab, content, rss: string): string = # result = "" @@ -23,7 +23,7 @@ # if t != "index" and t != "community" and t != "news": # let name = c.tabs[i].key # if currentTab == t: - # or greet(p) # declare a C procedure.. proc unsafeScanf(f: File, s: cstring) {.varargs, - importc: "fscanf", + importc: "fscanf", header: "<stdio.h>".} # ..and use it... @@ -191,7 +191,7 @@ runForever() - + # if currentTab == "index": # end if diff --git a/web/news.txt b/web/news.txt index ac6f8ae09..aaf3c9385 100644 --- a/web/news.txt +++ b/web/news.txt @@ -71,6 +71,8 @@ News are likely to break as well. - Base methods now need to be annotated with the ``base`` pragma. This makes multi methods less error-prone to use with the effect system. + - Nim's parser directive ``#!`` is now ``#?`` in order to produce no conflicts + with Unix's ``#!``. Library Additions