Named arguments in commands + many grammar fixes (#20994)

* Breaking parser changes, implement https://github.com/nim-lang/RFCs/issues/442

Types are separated from expressions and better reflected in the grammar.

* add test

* more accurate grammar

* fix keyword typedescs

* accept expressions in proc argument lists

* CI "fixes"

* fixes

* allow full ref expressions again, adapt old tests

* cleanup, fix some tests

* improve grammar, try and revert semtypes change

* restrict sigil binding to identOrLiteral

* fix, should have caught this immediately

* add changelog entry, fix double not nil bug

* correct grammar

* change section

* fix

* real fix hopefully

* fix test

* support LL(1) for tuples

* make grammar.txt too
This commit is contained in:
metagn
2022-12-06 15:11:56 +03:00
committed by GitHub
parent 1564ae650f
commit 4ca2dcb404
18 changed files with 285 additions and 149 deletions

View File

@@ -36,3 +36,12 @@ echo f -4
echo int -1 # doesn't compile
echo int `-` 1 # compiles
var num = 1
num += int 2
doAssert num == 3
import options
var opt = some some none int
opt = some some none int
opt = some none Option[int]

View File

@@ -0,0 +1,17 @@
discard """
output: '''
5
'''
"""
proc foo(a, b: int) =
echo a + b
foo a = 2, b = 3
import macros
macro bar(args: varargs[untyped]): untyped =
doAssert args[0].kind == nnkExprEqExpr
bar "a" = 1

View File

@@ -0,0 +1,16 @@
when false: # parse the following
let foo = Obj(
field1: proc (src: pointer, srcLen: Natural)
{.nimcall, gcsafe, raises: [IOError, Defect].} =
var file = FileOutputStream(s).file
implementWrites s.buffers, src, srcLen, "FILE",
writeStartAddr, writeLen,
file.writeBuffer(writeStartAddr, writeLen)
,
field2: proc {.nimcall, gcsafe, raises: [IOError, Defect].} =
flushFile FileOutputStream(s).file
,
field3: proc () {.nimcall, gcsafe, raises: [IOError, Defect].} =
close FileOutputStream(s).file
)

View File

@@ -0,0 +1,3 @@
when false:
type Foo = Bar not nil not nil #[tt.Error
^ invalid indentation]#

View File

@@ -0,0 +1,10 @@
discard """
errormsg: "invalid indentation"
line: 10
column: 14
"""
type
A = (object | tuple | int)
B = int | object | tuple
C = object | tuple | int # issue #8846

View File

@@ -0,0 +1,25 @@
proc foo[T: ptr int | ptr string](x: T) = discard
var x = "abc"
foo(addr x)
let n = 3'u32
type Double = (
when n.sizeof == 4: uint64
elif n.sizeof == 2: uint32
else: uint16
)
type
A = (ref | ptr | pointer)
B = pointer | ptr | ref
C = ref | ptr | pointer
template `+`(a, b): untyped = (b, a)
template `*`(a, b): untyped = (a, b)
doAssert (ref int + ref float * ref string + ref bool) is
(ref bool, ((ref float, ref string), ref int))
type X = ref int + ref float * ref string + ref bool
doAssert X is (ref bool, ((ref float, ref string), ref int))
type SomePointer = proc | ref | ptr | pointer