# a GML parser # Here is the GML grammar # corrected from me because the original at # http://www.uni-passau.de/Graphlet/GML had some errors # # corrections are # (1) use instring* in string # (2) add character,lowercase,uppercase definitions # (3) skip whitespace definition, this is obvious # (4) use digit+ in mantissa # # additions are # (1) no empty list is allowed # (2) either intpart or fraction of a real must contain a number # (3) comments can be on a separate or at the end of the line # # # gml: list # list: (whitespace* key whitespace+ value)+ # value: integer | real | string | "[" list "]" # key: character (character | digit)* # integer: sign digit+ # real: sign (digit+ "." digit* | digit* "." digit+) mantissa # string: """ instring* """ # sign: "+" | "-" | # digit: "0"..."9" # character: lowercase | uppercase # lowercase: "a"..."z" # uppercase: "A"..."Z" # mantissa: ("E"|"e") sign digit+ | # instring: | "&" character+ ";" # # Note that integers and reals can have prefixed zeros, e.g. 001 is 1 _class GMLBaseParser _code import GML _lex GML.GMLLexer() # the grammar """ gml: list (feddich); list: list keyvalue (gml_key_value)| keyvalue; keyvalue: KEY value (key_value); value: INTEGER | REAL | STRING | LSQB list RSQB (gmllist); """