diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2022-10-06 22:36:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-06 16:36:32 +0200 |
commit | e323b91a32ecff1473d9330605d85ad5f3684e99 (patch) | |
tree | c76ca63d3ce7590a4a95445abf33b82961c506ac | |
parent | 114acff98d64781b1fdfe951c6f543e2fec60000 (diff) | |
download | Nim-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.nim | 37 | ||||
-rw-r--r-- | doc/grammar.txt | 3 | ||||
-rw-r--r-- | tests/compiler/tgrammar.nim | 7 |
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() |