# Separate a .csg file into multiple colours. See https://stacks.stanford.edu/file/druid:pc102tg3656/TR011.pdf # for now, just a syntax checker... # docs: https://github.com/openscad/openscad/wiki/CSG-File-Format (main reference) # https://github.com/bobc/csg_tool/blob/master/grammar/CSG.y (pretty much ignored) # https://mfix.netl.doe.gov/gitlab/rangarad/csg-eb/-/blob/main/src/csg/parser.cpp?ref_type=heads (suggested existence of "undef") B<EOF> = 0; P<begin-arguments> = "(" ; P<end-arguments> = ")" ; P<begin-array> = "[" ; P<end-array> = "]" ; P<begin-scope> = "{" ; P<end-scope> = "}" ; P<value-separator> = "," ; P<object-separator> = ";" ; P<name-separator> = "=" ; P<array> = <begin-array> <value-list> <end-array> ; P<opt-sign> = "-", ; P<number> = <opt-sign><float>, <opt-sign><integer> ; # undef added from https://mfix.netl.doe.gov/gitlab/rangarad/csg-eb/-/blob/main/src/csg/parser.cpp?ref_type=heads P<value> = "true", "false", "undef", <array>, <number>, <instruction>, <name>, <string> ; P<rest-of-value-list> = <value-separator> <value> <rest-of-value-list>, ; P<value-list> = <value> <rest-of-value-list> ; P<quote> = «\\"» ; P<escaped-char> = «\\\\.» ; ##P<char> = <!quote> «.», <escaped-char> { P<char> = <!quote> «.» ; P<chars> = <char> <chars>, ; P<string> = <quote> <chars> <quote> ; P<name> = «[A-Za-z\\\\$][A-Za-z0-9_]*» ; P<opt-exponent> = «[Ee]» <opt-sign> <integer>, ; P<opt-integer> = <integer>, ; P<decimal-part> = «[0-9][0-9]*» ; P<float> = <opt-integer> «\\\\.» <decimal-part> <opt-exponent> ; P<integer> = «[0-9][0-9]*» ; P<instruction-list> = <instruction> <instruction-list>, ; P<opt-block> = <begin-scope> <instruction-list> <end-scope>, <object-separator> ; P<argument> = <name> <name-separator> <value>, <value> ; P<rest-of-argument-list> = <value-separator> <argument> <rest-of-argument-list>, ; P<opt-argument-list> = <argument> <rest-of-argument-list>, ; P<instruction> = <name> <begin-arguments> <opt-argument-list> <end-arguments> <opt-block> ; P<SS> = <instruction-list> <EOF> ; E