module languages/bnf/syntax/BNF

imports basic/Whitespace

hiddens
context-free start-symbols
  Rules

exports
sorts Rule Rules NonTerminal Terminal Element Elements

lexical syntax
  "<" ~[\<\>]+ ">"               -> NonTerminal          
  ~[\<\ \t\|\[\]\{\}] ~[\ \t\n]* -> Terminal             
  "..."                          -> Terminal    {reject} 
  "::="                          -> Terminal    {reject} 

lexical restrictions
  Terminal -/- ~[\ \t\n]

context-free syntax
  NonTerminal "::=" Elements -> Rule      
  {Element "|"}+             -> Elements  
  Rule*                      -> Rules     
  NonTerminal                -> Element   
  Terminal                   -> Element   
  "[" {Element "|"}+ "]"     -> Element   
  "{" {Element "|"}+ "}"     -> Element   

context-free priorities
  Element "..." -> Element >
  Element Element -> Element {left},
  { non-assoc: "|"             -> Element        
               "["             -> Element        
               "]"             -> Element        
               "{"             -> Element        
               "}"             -> Element        
               "<"             -> Element        
               ">"             -> Element        
               "..."           -> Element        
               "::="           -> Element        
               Element Element -> Element {left}  }