{- BNF Converter: Language definition Copyright (C) 2004 Author: Markus Forberg, Michael Pellauer, Aarne Ranta This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA -} -- Multi-view grammars (undocumented) LGr. LGrammar ::= [LDef] ; DefAll. LDef ::= Def ; DefSome. LDef ::= [Identifier] ":" Def ; LDefView. LDef ::= "views" [Identifier] ; -- separator LDef ";" ; []. [LDef] ::= ; (:[]). [LDef] ::= LDef ; (:). [LDef] ::= LDef ";" [LDef] ; -- extra semicolons allowed _. [LDef] ::= ";" [LDef] ; separator nonempty Identifier "," ; -- A Grammar is a sequence of definitions Grammar . Grammar ::= [Def] ; -- separator Def ";" ; -- Note: this still permits a final semicolon. []. [Def] ::= ; (:[]). [Def] ::= Def ; (:). [Def] ::= Def ";" [Def] ; -- extra semicolons allowed _. [Def] ::= ";" [Def] ; -- The rules of the grammar Rule . Def ::= Label "." Cat "::=" [Item] ; -- Items Terminal . Item ::= String ; NTerminal . Item ::= Cat ; terminator Item "" ; -- Categories (non-terminals) ListCat . Cat ::= "[" Cat "]" ; IdCat . Cat ::= Identifier ; -- Labels with or without profiles LabNoP . Label ::= LabelId ; LabP . Label ::= LabelId [ProfItem] ; -- A second label can be given in use of profiles and serves as -- ``original function name'' (undocumented feature). LabPF . Label ::= LabelId LabelId [ProfItem] ; LabF . Label ::= LabelId LabelId ; -- functional labels Id . LabelId ::= Identifier ; -- AST constructor Wild . LabelId ::= "_" ; -- No AST constructor (embedding) ListE . LabelId ::= "[" "]" ; -- Empty list ListCons . LabelId ::= "(" ":" ")" ; -- Cons ListOne . LabelId ::= "(" ":" "[" "]" ")" ; -- Singleton list -- profiles (= permutation and binding patterns) ProfIt . ProfItem ::= "(" "[" [IntList] "]" "," "[" [Integer] "]" ")" ; Ints . IntList ::= "[" [Integer] "]" ; separator Integer "," ; separator IntList "," ; terminator nonempty ProfItem "" ; -- Pragmas Comment . Def ::= "comment" String ; -- Line comment Comments . Def ::= "comment" String String ; -- Block comment Internal . Def ::= "internal" Label "." Cat "::=" [Item] ; -- No parsing, AST and printing only Token. Def ::= "token" Identifier Reg ; -- Lexer token PosToken. Def ::= "position" "token" Identifier Reg ; -- Lexer token with position info Entryp. Def ::= "entrypoints" [Identifier] ; -- Names of parsers Separator. Def ::= "separator" MinimumSize Cat String ; -- List Terminator. Def ::= "terminator" MinimumSize Cat String ; -- List Delimiters. Def ::= "delimiters" Cat String String Separation MinimumSize; Coercions. Def ::= "coercions" Identifier Integer ; -- Embeddings and parenthesized exprs. Rules. Def ::= "rules" Identifier "::=" [RHS] ; -- Automatically generated lables (e.g. enums) Function. Def ::= "define" Identifier [Arg] "=" Exp; Arg. Arg ::= Identifier ; separator Arg "" ; -- Lists SepNone. Separation ::= ; SepTerm. Separation ::= "terminator" String; SepSepar. Separation ::= "separator" String; -- Layout Layout. Def ::= "layout" [String] ; -- Layout start keywords LayoutStop. Def ::= "layout" "stop" [String] ; -- Layout stop keywords LayoutTop. Def ::= "layout" "toplevel" ; -- Should the toplevel be a block? separator nonempty String "," ; -- Expressions Cons. Exp ::= Exp1 ":" Exp ; App. Exp1 ::= Identifier [Exp2] ; Var. Exp2 ::= Identifier ; LitInt. Exp2 ::= Integer ; LitChar. Exp2 ::= Char ; LitString. Exp2 ::= String ; LitDouble. Exp2 ::= Double ; List. Exp2 ::= "[" [Exp] "]" ; coercions Exp 2; separator Exp "," ; -- list list separator nonempty Exp2 "" ; -- argument list RHS. RHS ::= [Item] ; separator nonempty RHS "|" ; -- List size condition MNonempty. MinimumSize ::= "nonempty" ; MEmpty. MinimumSize ::= ; -- Regular expressions RAlt. Reg ::= Reg "|" Reg1 ; -- left-associative RMinus. Reg1 ::= Reg1 "-" Reg2 ; -- left-associative RSeq. Reg2 ::= Reg2 Reg3 ; -- left-associative RStar. Reg3 ::= Reg3 "*" ; RPlus. Reg3 ::= Reg3 "+" ; ROpt. Reg3 ::= Reg3 "?" ; REps. Reg3 ::= "eps" ; -- empty string, same as {""} RChar. Reg3 ::= Char ; -- single character RAlts. Reg3 ::= "[" String "]" ; -- list of alternative characters RSeqs. Reg3 ::= "{" String "}" ; -- character sequence RDigit. Reg3 ::= "digit" ; RLetter. Reg3 ::= "letter" ; RUpper. Reg3 ::= "upper" ; RLower. Reg3 ::= "lower" ; RAny. Reg3 ::= "char" ; coercions Reg 3; -- LBNF identifiers position token Identifier letter (letter | digit | '_')* ; -- Comments in BNF source comment "--" ; comment "{-" "-}" ;