about summary refs log blame commit diff
path: root/src/fix-ng/fix.sdf
blob: e09480314bc4fb3f05ee5e660298015d9f6b7db3 (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 Bind
  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("Function"), right}

    "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

    "[" Expr* "]" -> Expr {cons("List")}

    Expr "." Id -> Expr {cons("Select")}

    "if" Expr "then" Expr "else" Expr -> Expr {cons("If")}

    Expr "==" Expr -> Expr {cons("OpEq")}

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

  context-free priorities

    Expr "." Id -> Expr
  > 
  > Expr Expr -> Expr
  > "{" {Id ","}* "}" ":" Expr -> Expr


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

module Fix-Lexicals
exports
  sorts Id Path
  lexical syntax
    [a-zA-Z\_][a-zA-Z0-9\_\']* -> Id
    "rec" -> Id {reject}
    "true" -> Id {reject}
    "false" -> Id {reject}

    [0-9]+ -> Int

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

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

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

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


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

module URI
exports
  sorts Uri
  lexical syntax
    Uscheme ":" (Uhierpath | Uopaquepath) -> Uri

    (Unetpath | Uabspath) ("?" Uquery)? -> Uhierpath
    Uuricnoslash Uuric* -> Uopaquepath

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

    "//" Uauthority Uabspath? -> Unetpath
    "/" Upathsegments -> Uabspath
    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
  lexical syntax
    [\ \t\n] -> LAYOUT
    HashComment -> LAYOUT
    Comment -> LAYOUT
    "#" ~[\n]* [\n] -> HashComment
    "//" ~[\n]* [\n] -> HashComment
    "/*" ( ~[\*] | Asterisk )* "*/" -> Comment
    [\*] -> Asterisk
  lexical restrictions
    Asterisk -/- [\/]
  context-free restrictions
    LAYOUT? -/- [\ \t\n] | [\#]
  syntax
    HashComment <START> -> <START>