content: module BNFC.Backend.Java.Utils where
  
  import BNFC.CF
  import BNFC.Utils ( mkName, NameStyle(..))
  import BNFC.Backend.Common.NamedVariables
  
  -- | Make a Java line comment
  
  comment :: String -> String
  comment = ("// " ++)
  
  javaReserved :: [String]
  javaReserved =
    [ "abstract"
    , "assert"
    , "boolean"
    , "break"
    , "byte"
    , "case"
    , "catch"
    , "char"
    , "class"
    , "const"
    , "continue"
    , "default"
    , "do"
    , "double"
    , "else"
    , "enum"
    , "extends"
    , "false"         -- there for Java/ANTLR backend
    , "final"
    , "finally"
    , "float"
    , "for"
    , "goto"
    , "if"
    , "implements"
    , "import"
    , "instanceof"
    , "int"
    , "interface"
    , "long"
    , "native"
    , "new"
    , "null"          -- there for Java/ANTLR backend
    -- , "Object"
    , "package"
    , "private"
    , "protected"
    , "public"
    , "return"
    , "short"
    , "static"
    , "strictfp"
    , "super"
    , "switch"
    , "synchronized"
    , "true"          -- there for Java/ANTLR backend
    , "this"
    , "throw"
    , "throws"
    , "transient"
    , "try"
    , "void"
    , "volatile"
    , "while"
    ]
  
  -- | Append an underscore if there is a clash with a java or ANTLR keyword.
  --   E.g. "Grammar" clashes with ANTLR keyword "grammar" since
  --   we sometimes need the upper and sometimes the lower case version
  --   of "Grammar" in the generated parser.
  getRuleName :: String -> String
  getRuleName z
    | firstLowerCase z `elem` ("grammar" : javaReserved) = z ++ "_"
    | otherwise = z
  
  getLabelName :: Fun -> String
  getLabelName = mkName ["Rule"] CamelCase
  
  -- | Make a new entrypoint NT for an existing NT.
  
  startSymbol :: String -> String
  startSymbol = ("Start_" ++)
  