forked from lix-project/lix
140 lines
3.7 KiB
Plaintext
140 lines
3.7 KiB
Plaintext
%% Note: this SDF grammar is no longer used in the Nix expression
|
|
%% parser and may not be up to date.
|
|
|
|
definition
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%% Top level syntax.
|
|
|
|
module Nix
|
|
imports Nix-Exprs Nix-Layout
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%% Expressions.
|
|
|
|
module Nix-Exprs
|
|
imports Nix-Lexicals
|
|
exports
|
|
sorts Expr Formal Bind ExprList
|
|
context-free start-symbols Expr
|
|
context-free syntax
|
|
|
|
Id -> Expr {cons("Var")}
|
|
Int -> Expr {cons("Int")}
|
|
Str -> Expr {cons("Str")}
|
|
Uri -> Expr {cons("Uri")}
|
|
Path -> Expr {cons("Path")}
|
|
|
|
"(" Expr ")" -> Expr {bracket}
|
|
|
|
Expr Expr -> Expr {cons("Call"), left}
|
|
|
|
Id ":" Expr -> Expr {cons("Function1")}
|
|
"{" {Formal ","}* "}" ":" Expr -> Expr {cons("Function")}
|
|
Id -> Formal {cons("NoDefFormal")}
|
|
Id "?" Expr -> Formal {cons("DefFormal")}
|
|
|
|
"assert" Expr ";" Expr -> Expr {cons("Assert")}
|
|
|
|
"with" Expr ";" Expr -> Expr {cons("With")}
|
|
|
|
"rec" "{" Bind* "}" -> Expr {cons("Rec")}
|
|
"let" "{" Bind* "}" -> Expr {cons("LetRec")}
|
|
"{" Bind* "}" -> Expr {cons("Attrs")}
|
|
|
|
Id "=" Expr ";" -> Bind {cons("Bind")}
|
|
"inherit" ("(" Expr ")")? Id* ";" -> Bind {cons("Inherit")}
|
|
|
|
"[" ExprList "]" -> Expr {cons("List")}
|
|
-> ExprList {cons("ExprNil")}
|
|
Expr ExprList -> ExprList {cons("ExprCons")}
|
|
|
|
Expr "." Id -> Expr {cons("Select")}
|
|
|
|
"if" Expr "then" Expr "else" Expr -> Expr {cons("If")}
|
|
|
|
Expr "==" Expr -> Expr {cons("OpEq"), non-assoc}
|
|
Expr "!=" Expr -> Expr {cons("OpNEq"), non-assoc}
|
|
|
|
"!" Expr -> Expr {cons("OpNot")}
|
|
Expr "&&" Expr -> Expr {cons("OpAnd"), right}
|
|
Expr "||" Expr -> Expr {cons("OpOr"), right}
|
|
Expr "->" Expr -> Expr {cons("OpImpl"), right}
|
|
|
|
Expr "//" Expr -> Expr {cons("OpUpdate"), right}
|
|
Expr "~" Expr -> Expr {cons("SubPath"), non-assoc}
|
|
Expr "?" Id -> Expr {cons("OpHasAttr")}
|
|
Expr "+" Expr -> Expr {cons("OpPlus"), left}
|
|
Expr "++" Expr -> Expr {cons("OpConcat"), right}
|
|
|
|
context-free priorities
|
|
|
|
Expr "." Id -> Expr
|
|
> Expr ExprList -> ExprList
|
|
> Expr Expr -> Expr
|
|
> Expr "~" Expr -> Expr
|
|
> Expr "?" Id -> Expr
|
|
> Expr "++" Expr -> Expr
|
|
> Expr "+" Expr -> Expr
|
|
> "!" Expr -> Expr
|
|
> Expr "//" Expr -> Expr
|
|
> { Expr "==" Expr -> Expr
|
|
Expr "!=" Expr -> Expr
|
|
}
|
|
> Expr "&&" Expr -> Expr
|
|
> Expr "||" Expr -> Expr
|
|
> Expr "->" Expr -> Expr
|
|
> "if" Expr "then" Expr "else" Expr -> Expr
|
|
> "assert" Expr ";" Expr -> Expr
|
|
> "with" Expr ";" Expr -> Expr
|
|
> Id ":" Expr -> Expr
|
|
> "{" {Formal ","}* "}" ":" Expr -> Expr
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%% Lexical syntax.
|
|
|
|
module Nix-Lexicals
|
|
exports
|
|
sorts Id Int Str Path Uri
|
|
lexical syntax
|
|
[a-zA-Z\_][a-zA-Z0-9\_\']* -> Id
|
|
"rec" | "let" | "if" | "then" | "else" | "assert" | "with" | "inherit" -> Id {reject}
|
|
|
|
[0-9]+ -> Int
|
|
|
|
"\"" ~[\n\"]* "\"" -> Str
|
|
|
|
[a-zA-Z0-9\.\_\-\+]* ("/"[a-zA-Z0-9\.\_\-\+]+)+ -> Path
|
|
|
|
[a-zA-Z] [a-zA-Z0-9\+\-\.]* ":" [a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']+ -> Uri
|
|
|
|
lexical restrictions
|
|
Id -/- [a-zA-Z0-9\_\']
|
|
Int -/- [0-9]
|
|
Path -/- [a-zA-Z0-9\.\_\-\+\/]
|
|
Uri -/- [a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']
|
|
"rec" "let" "if" "then" "else" "assert" "with" "inherit" -/- [A-Za-z0-9\_\']
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%% Layout.
|
|
|
|
module Nix-Layout
|
|
exports
|
|
sorts HashComment Asterisk Comment
|
|
lexical syntax
|
|
[\ \t\n] -> LAYOUT
|
|
HashComment -> LAYOUT
|
|
Comment -> LAYOUT
|
|
"#" ~[\n]* -> HashComment
|
|
"/*" ( ~[\*] | Asterisk )* "*/" -> Comment
|
|
[\*] ~[\/] -> Asterisk
|
|
lexical restrictions
|
|
HashComment -/- ~[\n]
|
|
context-free restrictions
|
|
LAYOUT? -/- [\ \t\n\#]
|
|
LAYOUT? -/- [\/].[\*]
|