summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2022-10-06 22:36:32 +0800
committerGitHub <noreply@github.com>2022-10-06 16:36:32 +0200
commite323b91a32ecff1473d9330605d85ad5f3684e99 (patch)
treec76ca63d3ce7590a4a95445abf33b82961c506ac
parent114acff98d64781b1fdfe951c6f543e2fec60000 (diff)
downloadNim-e323b91a32ecff1473d9330605d85ad5f3684e99.tar.gz
correct grammar (ref #20199) and add check for grammar.txt (#20494)
* correct grammar; ref #20199

* add check for keeping grammar.txt up-to-date

* add nimTestGrammar
-rw-r--r--compiler/parser.nim37
-rw-r--r--doc/grammar.txt3
-rw-r--r--tests/compiler/tgrammar.nim7
3 files changed, 35 insertions, 12 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 9f4897665..2c514ee74 100644
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -16,20 +16,37 @@
 
 
 # In fact the grammar is generated from this file:
-when isMainModule:
+when isMainModule or defined(nimTestGrammar):
   # Leave a note in grammar.txt that it is generated:
   #| # This file is generated by compiler/parser.nim.
-  import pegs
+  import std/pegs
   when defined(nimPreviewSlimSystem):
     import std/syncio
-  var outp = open("doc/grammar.txt", fmWrite)
-  for line in lines("compiler/parser.nim"):
-    if line =~ peg" \s* '#| ' {.*}":
-      outp.write matches[0], "\L"
-  outp.close
-
-  import ".." / tools / grammar_nanny
-  checkGrammarFile()
+
+  proc writeGrammarFile(x: string) =
+    var outp = open(x, fmWrite)
+    for line in lines("compiler/parser.nim"):
+      if line =~ peg" \s* '#| ' {.*}":
+        outp.write matches[0], "\L"
+    outp.close
+
+  when defined(nimTestGrammar):
+    import std/os
+    from ../testament/lib/stdtest/specialpaths import buildDir
+    const newGrammarText = buildDir / "grammar.txt"
+
+    if not dirExists(buildDir):
+      createDir(buildDir)
+
+    writeGrammarFile(newGrammarText)
+
+    proc checkSameGrammar*() =
+      doAssert sameFileContent(newGrammarText, "doc/grammar.txt"),
+              "execute 'nim r compiler.nim' to keep grammar.txt up-to-date"
+  else:
+    writeGrammarFile("doc/grammar.txt")
+    import ".." / tools / grammar_nanny
+    checkGrammarFile()
 
 import
   llstream, lexer, idents, strutils, ast, msgs, options, lineinfos,
diff --git a/doc/grammar.txt b/doc/grammar.txt
index 29a4300b6..63ce4503c 100644
--- a/doc/grammar.txt
+++ b/doc/grammar.txt
@@ -175,8 +175,7 @@ objectDecl = 'object' ('of' typeDesc)? COMMENT? objectPart
 conceptParam = ('var' | 'out')? symbol
 conceptDecl = 'concept' conceptParam ^* ',' (pragma)? ('of' typeDesc ^* ',')?
               &IND{>} stmt
-typeDef = identWithPragmaDot genericParamList? '=' optInd typeDefAux
-            indAndComment? / identVisDot genericParamList? pragma '=' optInd typeDefAux
+typeDef = identVisDot genericParamList? pragma '=' optInd typeDefAux
             indAndComment?
 varTuple = '(' optInd identWithPragma ^+ comma optPar ')' '=' optInd expr
 colonBody = colcom stmt postExprBlocks?
diff --git a/tests/compiler/tgrammar.nim b/tests/compiler/tgrammar.nim
new file mode 100644
index 000000000..772d0f0cc
--- /dev/null
+++ b/tests/compiler/tgrammar.nim
@@ -0,0 +1,7 @@
+discard """
+  matrix: "-d:nimTestGrammar"
+"""
+
+import compiler/parser
+
+checkSameGrammar()