about summary refs log blame commit diff
path: root/src/libexpr/nix.sdf
blob: b6bb23ebd4eaca35e1d2e5b4557245548030d1b8 (plain) (tree)


















                                                                      
                                                

                     
                            
 
                             
 
                             
 
                             
 
                               
 
                                  
 
                                          
 
                                                             

                                             
 
                                                   
 


                                                
 



                                      
 


                                                
 
                                        
 
                                                          
 






                                                     
 
                               
 

                         
                       
                             
                     






                                  
                                          






                                                                      
                                     

                                    
                        



                         

                          
                           
 
                 
 
                             
 
                                    
                           
                                    



                   


                          
                                  






                                                                      





                                                                  
                
                                                
 

                                                    




                                                                 
                                    














































                                                                      
                                           






                                                                      
                                        



                         

                                           

                                              
             

                      
               

                               
definition

module Main
imports Fix


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

module Fix
imports Fix-Exprs Fix-Layout


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

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

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

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

    Bool -> Expr {cons("Bool")}

  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 Bool
  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}
    "true" -> Id {reject}
    "false" -> Id {reject}
    "assert" -> Id {reject}

    [0-9]+ -> Int

    "\"" ~[\n\"]* "\"" -> Str

    PathComp ("/" PathComp)+ -> Path
    ("/" PathComp)+ -> Path
    [a-zA-Z0-9\.\_\-\+]+ -> PathComp

    "true" -> Bool
    "false" -> Bool

  lexical restrictions
    Id -/- [a-zA-Z0-9\_\']
    Int -/- [0-9]
    Path -/- [a-zA-Z0-9\.\_\-\+\/]


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% URIs (RFC 2396, appendix A).

module URI
exports
  sorts Uri Uhierpart Uopaquepart Uuricnoslash Unetpath Uabspath
        Urelpath Urelsegment Uscheme Uauthority Uregname Userver
        Uuserinfo Uhostport Uhost Uhostname Udomainlabel Utoplabel
        UIPv4address Uport Upath Upathsegments Usegment Uparam
        Upchar Uquery Ufragment Uuric Ureserved Uunreserved Umark
        Uescaped Uhex Ualphanum Ualpha Ulowalpha Uupalpha Udigit
  lexical syntax
    Uscheme ":" (Uhierpart | Uopaquepart) -> Uri

    (Unetpath | Uabspath) ("?" Uquery)? -> Uhierpart
    Uuricnoslash Uuric* -> Uopaquepart

    Uunreserved | Uescaped | [\;\?\:\@\&\=\+\$\,] -> Uuricnoslash

    "//" Uauthority Uabspath? -> Unetpath
    "/" Upathsegments -> Uabspath
    "//" Uuric* -> Uabspath {reject}
    Urelsegment Uabspath? -> Urelpath

    (Uunreserved | Uescaped | [\;\@\&\=\+\$\,])+ -> Urelsegment

    Ualpha (Ualpha | Udigit | [\+\-\.])* -> Uscheme

    Userver | Uregname -> Uauthority

    (Uunreserved | Uescaped | [\$\,\;\:\@\&\=\+])+ -> Uregname

    ((Uuserinfo "@") Uhostport) -> Userver
    (Uunreserved | Uescaped | [\;\:\&\=\+\$\,])* -> Uuserinfo

    Uhost (":" Uport)? -> Uhostport
    Uhostname | UIPv4address -> Uhost
    (Udomainlabel ".")+ Utoplabel "."? -> Uhostname
    Ualphanum | Ualphanum (Ualphanum | "-")* Ualphanum -> Udomainlabel
    Ualpha | Ualpha (Ualphanum | "-")* Ualphanum -> Utoplabel
    Udigit+ "." Udigit+ "." Udigit+ "." Udigit+ -> UIPv4address
    Udigit* -> Uport

    Uabspath | Uopaquepart -> Upath
    Usegment ("/" Usegment)* -> Upathsegments
    Upchar* (";" Uparam)* -> Usegment
    Upchar* -> Uparam
    Uunreserved | Uescaped | [\:\@\&\=\+\$\,] -> Upchar

    Uuric* -> Uquery

    Uuric* -> Ufragment

    Ureserved | Uunreserved | Uescaped -> Uuric
    [\;\/\?\:\@\&\=\+\$\,] -> Ureserved
    Ualphanum | Umark -> Uunreserved
    [\-\_\.\!\~\*\'\(\)] -> Umark

    "%" Uhex Uhex -> Uescaped
    Udigit | [A-Fa-f] -> Uhex

    Ualpha | Udigit -> Ualphanum
    Ulowalpha | Uupalpha -> Ualpha

    [a-z] -> Ulowalpha
    [A-Z] -> Uupalpha
    [0-9] -> Udigit

  lexical restrictions
    Uri -/- [a-zA-Z0-9\-\_\.\!\~\*\'\(\)\/]


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Layout.

module Fix-Layout
exports
  sorts HashComment Asterisk Comment EOF
  lexical syntax
    [\ \t\n] -> LAYOUT
    HashComment -> LAYOUT
    Comment -> LAYOUT
    "#" ~[\n]* ([\n] | EOF) -> HashComment
    "//" ~[\n]* ([\n] | EOF) -> HashComment
    "/*" ( ~[\*] | Asterisk )* "*/" -> Comment
    [\*] -> Asterisk
    "" -> EOF
  lexical restrictions
    Asterisk -/- [\/]
    EOF -/- ~[]
  context-free restrictions
    LAYOUT? -/- [\ \t\n] | [\#]