*foo means zero or more instances of foo +foo means one or more instances of foo ?foo means zero or one instances of foo means that "foo" must appear literally program = *declaration perl_code declaration = require | definition | draw_section | constraint_section require = string <;> definition = name ?( name) <{> *declaration <}> draw_section = <{> *drawable <}> drawable = <&> name | cname cname = name | cname <.> name constraint_section = <{> *constraint <}> constraint = expression +(<=> expression) expression = term + expression | term - expression term = atom * expression | atom / expression atom = name <(> expression <)> | name | tuple | number | <(> expression <)> tuple = <(> expression <,> expression *(<,> expression) <)> perl_code = <__END__\n> (any perl code)