Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 36 additions & 13 deletions src/libexpr/parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
%define api.namespace { ::nix::parser }
%define api.parser.class { BisonParser }
%locations
%define parse.error verbose
%define parse.error detailed
%defines
/* %no-lines */
%parse-param { void * scanner }
Expand Down Expand Up @@ -140,18 +140,41 @@ static Expr * makeCall(Exprs & exprs, PosIdx pos, Expr * fn, Expr * arg) {
%type <Expr *> path_start
%type <ToBeStringyExpr> string_parts string_attr
%type <StringToken> attr
%token <StringToken> ID
%token <StringToken> STR IND_STR
%token <NixInt> INT_LIT
%token <NixFloat> FLOAT_LIT
%token <StringToken> PATH HPATH SPATH PATH_END
%token <StringToken> URI
%token IF THEN ELSE ASSERT WITH LET IN_KW REC INHERIT EQ NEQ AND OR IMPL OR_KW
%token PIPE_FROM PIPE_INTO /* <| and |> */
%token DOLLAR_CURLY /* == ${ */
%token IND_STRING_OPEN IND_STRING_CLOSE
%token ELLIPSIS

%token <StringToken> ID "identifier"
%token <StringToken> STR "string"
%token <StringToken> IND_STR "indented string"
%token <NixInt> INT_LIT "integer"
%token <NixFloat> FLOAT_LIT "floating-point literal"
%token <StringToken> PATH "path"
%token <StringToken> HPATH "'~/…' path"
%token <StringToken> SPATH "'<…>' path"
%token <StringToken> PATH_END "end of path"
%token <StringToken> URI "URI"
%token IF "'if'"
%token THEN "'then'"
%token ELSE "'else'"
%token ASSERT "'assert'"
%token WITH "'with'"
%token LET "'let'"
%token IN_KW "'in'"
%token REC "'rec'"
%token INHERIT "'inherit'"
%token EQ "'=='"
%token NEQ "'!='"
%token LEQ "'<='"
%token GEQ "'>='"
%token UPDATE "'//'"
%token CONCAT "'++'"
%token AND "'&&'"
%token OR "'||'"
%token IMPL "'->'"
%token OR_KW "'or'"
%token PIPE_FROM "'<|'"
%token PIPE_INTO "'|>'"
%token DOLLAR_CURLY "'${'"
%token IND_STRING_OPEN "start of an indented string"
%token IND_STRING_CLOSE "end of an indented string"
%token ELLIPSIS "'...'"

%right IMPL
%left OR
Expand Down
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-and.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '&&'
at «stdin»:1:1:
1| && true
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-and.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
&& true
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-assert.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'assert', expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.assert
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-assert.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.assert
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-concat.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '++'
at «stdin»:1:1:
1| ++ []
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-concat.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
++ []
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '...', expecting '.' or '='
at «stdin»:1:5:
1| { a ... }
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-ellipsis.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ a ... }
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-else.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'else', expecting 'then'
at «stdin»:1:6:
1| if 1 else
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-else.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
if 1 else
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-eq.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '=='
at «stdin»:1:1:
1| == 1
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-eq.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
== 1
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-float.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected floating-point literal, expecting 'inherit'
at «stdin»:1:3:
1| { 1.5 = x; }
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-float.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ 1.5 = x; }
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-geq.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '>='
at «stdin»:1:1:
1| >= 1
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-geq.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
>= 1
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-hpath.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '~/…' path, expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.~/foo
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-hpath.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.~/foo
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-if.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'if', expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.if
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-if.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.if
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-impl.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '->'
at «stdin»:1:1:
1| -> x
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-impl.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-> x
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-in.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'in', expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.in
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-in.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected start of an indented string, expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.''
| ^
2|
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.''
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-inherit.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'inherit', expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.inherit
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-inherit.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.inherit
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-int.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected integer, expecting 'inherit'
at «stdin»:1:3:
1| { 1 = x; }
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-int.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ 1 = x; }
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-leq.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '<='
at «stdin»:1:1:
1| <= 1
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-leq.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<= 1
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-let.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'let', expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.let
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-let.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.let
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-neq.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '!='
at «stdin»:1:6:
1| 1 != != 2
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-neq.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1 != != 2
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-or.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '||'
at «stdin»:1:1:
1| || true
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-or.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
|| true
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-path.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected path, expecting identifier or 'or' or '${' or '"'
at «stdin»:1:7:
1| { } ? ./foo
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-path.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ } ? ./foo
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-rec.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'rec', expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.rec
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-rec.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.rec
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-spath.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '<…>' path, expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.<nixpkgs>
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-spath.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.<nixpkgs>
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-then.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'then'
at «stdin»:1:4:
1| if then
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-then.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
if then
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-update.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected '//'
at «stdin»:1:1:
1| // 1
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-update.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// 1
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-uri.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected URI
at «stdin»:1:11:
1| { inherit http://x; }
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-uri.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ inherit http://x; }
5 changes: 5 additions & 0 deletions tests/functional/lang/parse-fail-unexpected-with.err.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
error: syntax error, unexpected 'with', expecting identifier or 'or' or '${' or '"'
at «stdin»:1:3:
1| a.with
| ^
2|
1 change: 1 addition & 0 deletions tests/functional/lang/parse-fail-unexpected-with.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
a.with
Loading