I have this BNFC file describing a configuration file made of many sections where each section has a name between [] followed by a list of simple declaration
comment "#";
rulse Boolean ::= "True" | "False";
Conf. Config ::= [Section]; //a config is a list of sections
terminator Section "";
Sec. Section ::= "[" NomeSec "]" [Decl]; //A section is made of a name and a list of declarations
terminator Decl ";";
NomeSez. NomeSec ::= Ident;
Dec. Decl ::= VarN "=" Type;
VarName. VarN ::= Ident;
Int. Type::=Integer;
Char. Type::=Char;
String. Type::=String;
Float. Type::=Double;
Bool. Type::=Boolean;
Example:
[Section1]
Var1 = 3;
Var2 = "test";
#ignored comment
[SectionA]
var4 = True;
with an undefined number of sections and declarations.
I ran the command bnfc -m -java <filename> from the shell and everything goes ok a part from the pretty printer. When its time to compile the prettyprinter.java tons of errors are generated. For example:
ES5/PrettyPrinter.java:10: error: reference to String is ambiguos
private static final String _L_PAREN = new String("("); both class
ES5.Absyn.String and class java.lang.String in java.lang match
All the errors are of this type. I'm wondering , i just built the grammar , i failed the grammar or the BNFC failed? Thanks
Because BNFC creates java classes for each category and label, if use names that are in java.lang it creates ambiguities (e.g. String, Boolean...).
It works with the following renames (I also added an explicit entry point):
entrypoints Config;
comment "#";
rules MyBoolean ::= "True" | "False";
Conf. Config ::= [Section]; -- a config is a list of sections
terminator Section "";
Sec. Section ::= "[" NomeSec "]" [Decl]; -- A section is made of a name and a list of declarations
terminator Decl ";";
NomeSez. NomeSec ::= Ident;
Dec. Decl ::= VarN "=" Type;
VarName. VarN ::= Ident;
TInt. Type::=Integer;
TChar. Type::=Char;
TString. Type::=String;
TFloat. Type::=Double;
TBool. Type::=MyBoolean;