129 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 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 | Int | Str | Uri | Path -> Expr {cons("Var")}
 | |
| 
 | |
|     "(" 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}
 | |
| 
 | |
|   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
 | |
|   > "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
 | |
|     Asterisk -/- [\/]
 | |
|     HashComment -/- ~[\n]
 | |
|   context-free restrictions
 | |
|     LAYOUT? -/- [\ \t\n]
 |