BNFC 2.4.1.1 → 2.4.1.2
raw patch · 4 files changed
+295/−5 lines, 4 files
Files
- BNFC.cabal +8/−4
- Main.hs +1/−1
- formats/CFtoTxt.hs +249/−0
- formats/cpp_stl/STLUtils.hs +37/−0
BNFC.cabal view
@@ -1,5 +1,5 @@ Name: BNFC-Version: 2.4.1.1+Version: 2.4.1.2 cabal-version: >= 1.2 build-type: Simple category: Development@@ -54,6 +54,7 @@ OOAbstract, CFtoLatex, CFtoXML,+ CFtoTxt, -- Haskell HaskellTop, RegToAlex,@@ -100,12 +101,15 @@ CFtoBison, CFtoCPPPrinter, CFtoCPPAbs,+ -- C++ STL- STLTop,- CFtoSTLPrinter,- CFtoCVisitSkelSTL, CFtoBisonSTL, CFtoSTLAbs,+ STLUtils,+ CFtoCVisitSkelSTL,+ CFtoSTLPrinter,+ STLTop,+ -- C# CSharpTop, RegToGPLEX,
Main.hs view
@@ -46,7 +46,7 @@ import Data.List (elemIndex) title = unlines [- "The BNF Converter, 2.4.1.1", + "The BNF Converter, 2.4.1.2", "(c) Krasimir Angelov, Bjorn Bringert, Johan Broberg, Paul Callaghan, ", " Markus Forsberg, Ola Frid, Peter Gammie, Patrik Jansson, ", " Kristofer Johannisson, Antti-Juhani Kaijanaho, Ulf Norell, ",
+ formats/CFtoTxt.hs view
@@ -0,0 +1,249 @@+{-+ BNF Converter: Latex Generator+ Copyright (C) 2004 Author: Markus Forberg, 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, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA+-}++module CFtoTxt (cfToTxt)where++import CF+import AbsBNF (Reg (..))+import Utils+import List (nub,intersperse)++cfToTxt :: String -> CF -> String+cfToTxt name cf = unlines [+ beginDocument name,+ introduction,+ prtTerminals name cf,+ prtBNF name cf+ ]++introduction :: String+introduction = concat + [+ "\nThis document was automatically generated by ",+ "the //BNF-Converter//.",+ " It was generated together with the lexer, the parser, and the",+ " abstract syntax module, which guarantees that the document",+ " matches with the implementation of the language (provided no",+ " hand-hacking has taken place).\n"+ ] ++prtTerminals :: String -> CF -> String+prtTerminals name cf = unlines [+ "==The lexical structure of " ++ name ++ "==",+ identSection cf,+ "===Literals===",+ prtLiterals name cf,+ unlines (map prtOwnToken (tokenPragmas cf)),+ "===Reserved words and symbols===",+ prtReserved name cf, + prtSymb name cf,+ "===Comments===",+ prtComments $ comments cf+ ]++identSection cf = if not (hasIdent cf) then [] else+ unlines [+ "===Identifiers===",+ prtIdentifiers+ ]++prtIdentifiers :: String+prtIdentifiers = unlines+ [+ "Identifiers //Ident// are unquoted strings beginning with a letter,",+ "followed by any combination of letters, digits, and the characters ``_ '``",+ "reserved words excluded."+ ]++prtLiterals :: String -> CF -> String+prtLiterals name cf = + unlines $ map stringLit $+ filter (`notElem` ["Ident"]) $ + literals cf++stringLit :: String -> String+stringLit cat = unlines $ case cat of+ "Char" -> ["Character literals //Char// have the form",+ "``'``//c//``'``, where //c// is any single character.",+ ""+ ]+ "String" -> ["String literals //String// have the form",+ "``\"``//x//``\"``}, where //x// is any sequence of any characters",+ "except ``\"`` unless preceded by ``\\``.",+ ""]+ "Integer" -> ["Integer literals //Integer// are nonempty sequences of digits.",+ ""]+ "Double" -> ["Double-precision float literals //Double// have the structure",+ "indicated by the regular expression" +++ + "``digit+ '.' digit+ ('e' ('-')? digit+)?`` i.e.\\",+ "two sequences of digits separated by a decimal point, optionally",+ "followed by an unsigned or negative exponent.",+ ""]+ _ -> []++prtOwnToken (name,reg) = unlines + [name +++ "literals are recognized by the regular expression",+ "```" +++ latexRegExp reg +++ "```" + ]+ +prtComments :: ([(String,String)],[String]) -> String+prtComments (xs,ys) = concat+ [+ if (null ys) then + "There are no single-line comments in the grammar."+ else+ "Single-line comments begin with " ++ sing ++".",+ if (null xs) then+ "There are no multiple-line comments in the grammar."+ else+ "Multiple-line comments are enclosed with " ++ mult ++"."+ ]+ where + sing = concat $ intersperse ", " $ map (symbol.prt) ys+ mult = concat $ intersperse ", " $ + map (\(x,y) -> (symbol (prt x)) + ++ " and " +++ (symbol (prt y))) xs++prtSymb :: String -> CF -> String+prtSymb name cf = case symbols cf of+ [] -> "\nThere are no symbols in " ++ name ++ ".\n"+ xs -> "The symbols used in " ++ name ++ " are the following:\n"+ +++ (tabular 4 $ three $ map (symbol.prt) xs)++prtReserved :: String -> CF -> String+prtReserved name cf = case reservedWords cf of+ [] -> stringRes name ++ + "\nThere are no reserved words in " ++ name ++ ".\n"+ xs -> stringRes name ++ + (tabular 4 $ three $ map quote xs)++stringRes :: String -> String+stringRes name = concat + ["The set of reserved words is the set of terminals ",+ "appearing in the grammar. Those reserved words ",+ "that consist of non-letter characters are called symbols, and ",+ "they are treated in a different way from those that ",+ "are similar to identifiers. The lexer ",+ "follows rules familiar from languages ",+ "like Haskell, C, and Java, including longest match ",+ "and spacing conventions.",+ "\n\n",+ "The reserved words used in " ++ name ++ " are the following:\n"]++three :: [String] -> [[String]] +three [] = []+three [x] = [[x,[],[],[]]]+three [x,y] = [[x,y,[],[]]]+three [x,y,z] = [[x,y,z,[]]]+three (x:y:z:u:xs) = [x,y,z,u] : three xs++prtBNF :: String -> CF -> String+prtBNF name cf = unlines [+ "==The syntactic structure of " ++ name ++"==",+ "Non-terminals are enclosed between < and >. ",+ "The symbols " ++ arrow ++ " (production), " ++ + delimiter ++" (union) ",+ "and " ++ empty ++ " (empty rule) belong to the BNF notation. ",+ "All other symbols are terminals.",+ "",+ prtRules (ruleGroups cf)+ ]++prtRules :: [(Cat,[Rule])] -> String+prtRules [] = []+prtRules ((c,[]):xs) + = tabular 3 [[nonterminal c,arrow,[]]] ++ prtRules xs+prtRules ((c,(r:rs)):xs) + = tabular 3 ([[nonterminal c,arrow,prtSymbols $ rhsRule r]] ++ + [[[],delimiter,prtSymbols (rhsRule y)] | y <- rs]) ++ + --- "\n\n" ++ --- with empty lines good for latex, bad for html+ prtRules xs++prtSymbols :: [Either Cat String] -> String+prtSymbols [] = empty+prtSymbols xs = foldr (+++) [] (map p xs)+ where p (Left r) = nonterminal r+ p (Right r) = terminal r+ +prt :: String -> String+prt s = s++reserved :: String -> String+reserved s = "{\\reserved{" ++ s ++ "}}"++literal :: String -> String+literal s = "{\\literal{" ++ s ++ "}}"++empty :: String+empty = "**eps**"++symbol :: String -> String+symbol s = s++tabular :: Int -> [[String]] -> String+tabular n xs = unlines [unwords (intersperse "|" (" " : x)) | x <- xs]++terminal :: String -> String+terminal s = "``" ++ s ++ "``"++nonterminal :: String -> String+nonterminal s = "//" ++ s ++ "//"++arrow :: String+arrow = "->"++delimiter :: String+delimiter = " **|** "++beginDocument :: String -> String+beginDocument name = unlines [+ "The Language " ++ name,+ "BNF Converter",+ "",+ "",+ "%This txt2tags file is machine-generated by the BNF-converter",+ "%Process by txt2tags to generate html or latex",+ ""+ ]++latexRegExp :: Reg -> String+latexRegExp = quote . rex (0 :: Int) where+ rex i e = case e of+ RSeq reg0 reg -> ifPar i 2 $ rex 2 reg0 +++ rex 2 reg+ RAlt reg0 reg -> ifPar i 1 $ rex 1 reg0 +++ "|" +++ rex 1 reg+ RMinus reg0 reg -> ifPar i 1 $ rex 2 reg0 +++ "-" +++ rex 2 reg+ RStar reg -> rex 3 reg ++ "*"+ RPlus reg -> rex 3 reg ++ "+"+ ROpt reg -> rex 3 reg ++ "?"+ REps -> "eps"+ RChar c -> "'" ++ [c] ++ "'"+ RAlts str -> "[\"" ++ str ++ "\"]"+ RSeqs str -> "{\"" ++ str ++ "\"}"+ RDigit -> "digit"+ RLetter -> "letter"+ RUpper -> "upper"+ RLower -> "lower"+ RAny -> "char"+ ifPar i j s = if i > j then "(" ++ s ++ ")" else s+ +quote s = "``" ++ s ++ "``"
+ formats/cpp_stl/STLUtils.hs view
@@ -0,0 +1,37 @@+{-+ BNF Converter: C++ common functions+ Copyright (C) 2008 Author: Martin Ejdestig++ 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, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA+-}++module STLUtils where++import Char++nsDefine :: Maybe String -> String -> String+nsDefine inPackage h = maybe h (\ns -> map toUpper ns ++ "_" ++ h) inPackage++nsStart :: Maybe String -> String+nsStart inPackage = maybe "" (\ns -> "namespace " ++ ns ++ "\n{") inPackage++nsEnd :: Maybe String -> String+nsEnd inPackage = maybe "" (\ns -> "}") inPackage++nsScope :: Maybe String -> String+nsScope inPackage = maybe "" (\ns -> ns ++ "::") inPackage++nsString :: Maybe String -> String+nsString inPackage = maybe "" id inPackage