about summary refs log blame commit diff
path: root/src/libexpr/nix.sdf
blob: 36fbef39cb2845dec6de30d66501d527c5a0fd0d (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                                                      
                    
       
                                       

                     
                            
 
                             
 
                             
 
                             
 
                               
 
                                  
 
                                          
 
                                                             

                                             
 
                                                   
 


                                                
 

                                          
 


                                                
 
                                        
 
                                                          
 






                                                     
 

                         
                       
                             
                     






                                  
                                          






                                                                      
                                    

                                    
                        



                         
                           
 
                 
 
                             
 

                                
                           
                                    
 
                                                                                         
 


                          
                                  
                                                         






                                                                      
                                    



                         
                             



                                              
                         
                           
                        
definition

module Main
imports Fix


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Top level syntax.

module Fix
imports Fix-Exprs Fix-Layout


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Expressions.

module Fix-Exprs
imports Fix-Lexicals
exports
  sorts Expr Formal Bind Binds ExprList
  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}

    "{" {Formal ","}* "}" ":" Expr -> Expr {cons("Function")}
    Id -> Formal {cons("NoDefFormal")}
    Id "?" Expr -> Formal {cons("DefFormal")}

    "assert" Expr ";" Expr -> Expr {cons("Assert")}

    "rec" "{" Binds "}" -> Expr {cons("Rec")}
    "let" "{" Binds "}" -> Expr {cons("LetRec")}
    "{" Binds "}" -> Expr {cons("Attrs")}

    Bind* -> Binds
    Id "=" Expr ";" -> Bind {cons("Bind")}

    "[" 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}

  context-free priorities

    Expr "." Id -> Expr
  > Expr ExprList -> ExprList
  > Expr Expr -> Expr
  > "!" Expr -> Expr
  > Expr "==" Expr -> Expr
  > Expr "!=" Expr -> Expr
  > Expr "&&" Expr -> Expr
  > Expr "||" Expr -> Expr
  > Expr "->" Expr -> Expr
  > "assert" Expr ";" Expr -> Expr
  > "{" {Formal ","}* "}" ":" Expr -> Expr


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Lexical syntax.

module Fix-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}

    [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 Fix-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]