mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-12 06:18:51 +00:00
* correct grammar; ref #20199 * add check for keeping grammar.txt up-to-date * add nimTestGrammar
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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?
|
||||
|
||||
7
tests/compiler/tgrammar.nim
Normal file
7
tests/compiler/tgrammar.nim
Normal file
@@ -0,0 +1,7 @@
|
||||
discard """
|
||||
matrix: "-d:nimTestGrammar"
|
||||
"""
|
||||
|
||||
import compiler/parser
|
||||
|
||||
checkSameGrammar()
|
||||
Reference in New Issue
Block a user