forked from lix-project/lix
* Revive and update the SDF grammar for Nix expressions.
This commit is contained in:
parent
a5ceb5bc0b
commit
f797cb5855
|
@ -33,3 +33,11 @@ nixexpr.cc nixexpr.hh: nixexpr-ast.hh
|
|||
|
||||
|
||||
CLEANFILES =
|
||||
|
||||
|
||||
# SDF stuff (not built by default).
|
||||
nix.tbl: nix.sdf
|
||||
sdf2table -m Nix -s -i nix.sdf -o nix.tbl
|
||||
|
||||
test.ast: test.nix nix.tbl
|
||||
sglri -p nix.tbl -i test.nix -o test.ast
|
||||
|
|
141
src/libexpr/nix.sdf
Normal file
141
src/libexpr/nix.sdf
Normal file
|
@ -0,0 +1,141 @@
|
|||
definition
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%% Top level syntax.
|
||||
|
||||
module Nix
|
||||
imports Nix-Exprs Nix-Layout
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%% Expressions.
|
||||
|
||||
module Nix-Exprs
|
||||
imports Nix-Lexicals
|
||||
exports
|
||||
sorts Expr Formal Bind Binds 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" "{" Binds "}" -> Expr {cons("Rec")}
|
||||
"let" "{" Binds "}" -> Expr {cons("LetRec")}
|
||||
"{" Binds "}" -> Expr {cons("Attrs")}
|
||||
|
||||
Bind* -> Binds
|
||||
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
|
||||
> "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 PathComp Uri
|
||||
lexical syntax
|
||||
[a-zA-Z\_][a-zA-Z0-9\_\']* -> Id
|
||||
"rec" -> Id {reject}
|
||||
"let" -> Id {reject}
|
||||
"if" -> Id {reject}
|
||||
"then" -> Id {reject}
|
||||
"else" -> Id {reject}
|
||||
"assert" -> Id {reject}
|
||||
"inherit" -> Id {reject}
|
||||
|
||||
[0-9]+ -> Int
|
||||
|
||||
"\"" ~[\n\"]* "\"" -> Str
|
||||
|
||||
"." ("/" PathComp)+ -> Path
|
||||
".." ("/" PathComp)+ -> Path
|
||||
("/" PathComp)+ -> Path
|
||||
[a-zA-Z0-9\.\_\-\+]+ -> PathComp
|
||||
|
||||
[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\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%% 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]
|
Loading…
Reference in a new issue