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
This commit is contained in:
ringabout 2022-10-06 22:36:32 +08:00 • committed by GitHub
commit e323b91a32
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 11 deletions

View file

@ -16,18 +16,35 @@
# In fact the grammar is generated from this file: # 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: # Leave a note in grammar.txt that it is generated:
#| # This file is generated by compiler/parser.nim. #| # This file is generated by compiler/parser.nim.
import pegs import std/pegs
when defined(nimPreviewSlimSystem): when defined(nimPreviewSlimSystem):
import std/syncio import std/syncio
var outp = open("doc/grammar.txt", fmWrite)
proc writeGrammarFile(x: string) =
var outp = open(x, fmWrite)
for line in lines("compiler/parser.nim"): for line in lines("compiler/parser.nim"):
if line =~ peg" \s* '#| ' {.*}": if line =~ peg" \s* '#| ' {.*}":
outp.write matches[0], "\L" outp.write matches[0], "\L"
outp.close 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 import ".." / tools / grammar_nanny
checkGrammarFile() checkGrammarFile()

View file

@ -175,8 +175,7 @@ objectDecl = 'object' ('of' typeDesc)? COMMENT? objectPart
conceptParam = ('var' | 'out')? symbol conceptParam = ('var' | 'out')? symbol
conceptDecl = 'concept' conceptParam ^* ',' (pragma)? ('of' typeDesc ^* ',')? conceptDecl = 'concept' conceptParam ^* ',' (pragma)? ('of' typeDesc ^* ',')?
&IND{>} stmt &IND{>} stmt
typeDef = identWithPragmaDot genericParamList? '=' optInd typeDefAux typeDef = identVisDot genericParamList? pragma '=' optInd typeDefAux
indAndComment? / identVisDot genericParamList? pragma '=' optInd typeDefAux
indAndComment? indAndComment?
varTuple = '(' optInd identWithPragma ^+ comma optPar ')' '=' optInd expr varTuple = '(' optInd identWithPragma ^+ comma optPar ')' '=' optInd expr
colonBody = colcom stmt postExprBlocks? colonBody = colcom stmt postExprBlocks?

View file

@ -0,0 +1,7 @@
discard """
matrix: "-d:nimTestGrammar"
"""
import compiler/parser
checkSameGrammar()