| 1 | from time import time
|
|---|
| 2 | from lark import Lark
|
|---|
| 3 | t0 = time()
|
|---|
| 4 | atom_spec_parser = Lark(r"""
|
|---|
| 5 |
|
|---|
| 6 | command_list: command
|
|---|
| 7 | | command ";" command_list
|
|---|
| 8 |
|
|---|
| 9 | command: "color" atom_specifier "#" /[a-f0-9]{6}/
|
|---|
| 10 |
|
|---|
| 11 | atom_specifier: as_term "&" atom_specifier
|
|---|
| 12 | | as_term "|" atom_specifier
|
|---|
| 13 | | as_term
|
|---|
| 14 |
|
|---|
| 15 | as_term: "(" atom_specifier ")" zone_selector?
|
|---|
| 16 | | "~" as_term zone_selector?
|
|---|
| 17 | | SELECTOR_NAME zone_selector?
|
|---|
| 18 | | model_list
|
|---|
| 19 |
|
|---|
| 20 | model_list: model+
|
|---|
| 21 |
|
|---|
| 22 | model: ("#!" | "#") model_hierarchy ("##" attribute_list)? model_parts* zone_selector?
|
|---|
| 23 | | attribute_list model_parts* zone_selector*
|
|---|
| 24 | | model_parts zone_selector*
|
|---|
| 25 |
|
|---|
| 26 | model_hierarchy: model_range_list (/(?<!\s)\./ model_hierarchy)*
|
|---|
| 27 |
|
|---|
| 28 | model_range_list: model_range ("," model_range_list)*
|
|---|
| 29 |
|
|---|
| 30 | model_range: MODEL_SPEC_START "-" MODEL_SPEC_END
|
|---|
| 31 | | MODEL_SPEC_ANY
|
|---|
| 32 |
|
|---|
| 33 | model_parts: chain+
|
|---|
| 34 |
|
|---|
| 35 | chain: "/" part_list ("//" attribute_list)? residue*
|
|---|
| 36 | | "//" attribute_list residue*
|
|---|
| 37 | | residue+
|
|---|
| 38 |
|
|---|
| 39 | residue: ":" part_list ("::" attribute_list)? atom*
|
|---|
| 40 | | "::" attribute_list atom*
|
|---|
| 41 | | atom+
|
|---|
| 42 |
|
|---|
| 43 | part_list: PART_RANGE_LIST "," part_list
|
|---|
| 44 | | PART_RANGE_LIST
|
|---|
| 45 |
|
|---|
| 46 | // atom ranges are not allowed
|
|---|
| 47 |
|
|---|
| 48 | atom: "@" atom_list ("@@" attribute_list)?
|
|---|
| 49 | | "@@" attribute_list
|
|---|
| 50 |
|
|---|
| 51 | atom_list: ATOM_NAME "," atom_list
|
|---|
| 52 | | ATOM_NAME
|
|---|
| 53 |
|
|---|
| 54 | attribute_list: attr_test ("," attr_test)*
|
|---|
| 55 |
|
|---|
| 56 | attr_test: ATTR_NAME ATTR_OPERATOR ATTR_VALUE
|
|---|
| 57 | | ATTR_NAME
|
|---|
| 58 | | "~" ATTR_NAME
|
|---|
| 59 |
|
|---|
| 60 | zone_selector: ZONE_OPERATOR /[0-9]*\.?[0-9]+/
|
|---|
| 61 |
|
|---|
| 62 | ATOM_NAME: /-?[a-zA-Z0-9_'"*?\[\]\\]+/
|
|---|
| 63 | ATTR_NAME: /[a-zA-Z_][a-zA-Z0-9_]*/
|
|---|
| 64 | ATTR_OPERATOR: ">=" | ">" | "<=" | "<" | "==" | "=" | "!==" | "!=" | "<>"
|
|---|
| 65 | ATTR_VALUE: "\"" /[^"]+/ "\""
|
|---|
| 66 | | "'" /[^']+/ "'"
|
|---|
| 67 | | /[^,#:@ \t]+/
|
|---|
| 68 | // limit model numbers to 5 digits to avoid conflicts with hex colors
|
|---|
| 69 | MODEL_SPEC: /[0-9]{1,5}(?![0-9A-Fa-f])/
|
|---|
| 70 | MODEL_SPEC_ANY: MODEL_SPEC | "*"
|
|---|
| 71 | MODEL_SPEC_END: MODEL_SPEC | "end" | "*"
|
|---|
| 72 | MODEL_SPEC_START: MODEL_SPEC | "start" | "*"
|
|---|
| 73 | PART_RANGE_LIST: /-?[a-zA-Z0-9_'"*?\[\]\\]+/ ("-" /[-a-zA-Z0-9_'"\\]+/)?
|
|---|
| 74 | SELECTOR_NAME: /[a-zA-Z_][-+a-zA-Z0-9_]*/
|
|---|
| 75 | WHITESPACE: (" " | "\n" | "\t")+
|
|---|
| 76 | ZONE_OPERATOR: "@>" | "@<" | ":>" | ":<" | "/>" | "/<" | "#>" | "#<"
|
|---|
| 77 |
|
|---|
| 78 | %ignore WHITESPACE
|
|---|
| 79 |
|
|---|
| 80 | """, start = "command_list")
|
|---|
| 81 | t1 = time()
|
|---|
| 82 | parser = atom_spec_parser.parse("color #1/A:2/B:2 #977b64;color #1/A:3/B:3 #e46daf;color #1/A:4/B:4 #7dc891;color #1/A:5/B:5 #768daf;color #1/A:6/B:6 #bb1691;color #1/A:7/B:7 #1c5355;color #1/A:8/B:8 #5b1873;color #1/A:9/B:9 #d0af91;color #1/A:10/B:10 #6cb737;color #1/A:11/B:11 #8d7c55;color #1/A:12/B:12 #844173;color #1/A:13/B:13 #1f15a0;color #1/A:14/B:14 #a27f91;color #1/A:15/B:15 #19cb64;color #1/A:16/B:16 #484537;color #1/A:17/B:17 #61be37;color #1/A:18/B:18 #84a173;color #1/A:19/B:19 #c76691;color #1/A:20/B:20 #8f31a0;color #1/A:21/B:21 #9eb9af;color #1/A:22/B:22 #531564;color #1/A:23/B:23 #707046;color #1/A:24/B:24 #9b80af;color #1/A:25/B:25 #ca18a0;color #1/A:26/B:26 #377382;color #1/A:27/B:27 #26a137;color #1/A:28/B:28 #d3b1a0;color #1/A:29/B:29 #e267af;color #1/A:30/B:30 #c023af;color #1/A:31/B:31 #b18da0;color #1/A:32/B:32 #88bb55;color #1/A:33/B:33 #1fada0;color #1/A:34/B:34 #b22773;color #1/A:35/B:35 #ad19be;color #1/A:36/B:36 #6483af;color #1/A:37/B:37 #c9de91;color #1/A:38/B:38 #aab2be;color #1/A:39/B:39 #59d164;color #1/A:40/B:40 #6d6037;color #1/A:41/B:41 #1cd937;color #1/A:42/B:42 #b5cb82;color #1/A:43/B:43 #e28191;color #1/A:44/B:44 #9537a0;color #1/A:45/B:45 #d6b0a0;color #1/A:46/B:46 #3bcf46;color #1/A:47/B:47 #2c6737;color #1/A:48/B:48 #e586af;color #1/A:49/B:49 #e22daf;color #1/A:50/B:50 #e29d91;color #1/A:51/B:51 #493582;color #1/A:52/B:52 #cacca0;color #1/A:53/B:53 #7f2855;color #1/A:54/B:54 #86dd91;color #1/A:55/B:55 #b55764;color #1/A:56/B:56 #4ac155;color #1/A:57/B:57 #614a37;color #1/A:58/B:58 #9e69af;color #1/A:59/B:59 #5f8855;color #1/A:60/B:60 #958fa0;color #1/A:61/B:61 #9e45af;color #1/A:62/B:62 #b9beaf;color #1/A:63/B:63 #4add55;color #1/A:64/B:64 #5ba273;color #1/A:65/B:65 #bedf37;color #1/A:66/B:66 #359546;color #1/A:67/B:67 #262d37;color #1/A:68/B:68 #cf5bbe;color #1/A:69/B:69 #505c46;color #1/A:70/B:70 #76db37;color #1/A:71/B:71 #3d37be;color #1/A:72/B:72 #a28391;color #1/A:73/B:73 #b5cf64;color #1/A:74/B:74 #88b2a0;color #1/A:75/B:75 #bb4a91;color #1/A:76/B:76 #dc8755;color #1/A:77/B:77 #d579a0;color #1/A:78/B:78 #7c9846;color #1/A:79/B:79 #b57b82;color #1/A:80/B:80 #79cd46;color #1/A:81/B:81 #aa1abe;color #1/A:82/B:82 #ab4873;color #1/A:83/B:83 #c6df91;color #1/A:84/B:84 #b3b3be;color #1/A:85/B:85 #802d91;color #1/A:86/B:86 #d9c4af;color #1/A:87/B:87 #c64d91;color #1/A:88/B:88 #857b46;color #1/A:89/B:89 #a26d91;color #1/A:90/B:90 #c62991;color #1/A:91/B:91 #adb1a0;color #1/A:92/B:92 #584991;color #1/A:93/B:93 #93b382;color #1/A:94/B:94 #48e137;color #2/C:1 #88c56f;color #2/C:2 #7b5d60;color #2/C:3 #32d660;color #2/C:4 #339b7e;color #2/C:5 #702460;color #2/C:6 #6725ba;color #2/C:7 #dc536f;color #2/C:8 #a3db7e;color #2/C:9 #a8918d;color #2/C:10 #d84eba;color #2/C:11 #758b7e;color #2/C:12 #88d751;color #2/C:13 #75ab7e;color #2/C:14 #8e527e;color #2/C:15 #cf53d8;color #2/C:16 #dc636f;color #2/C:17 #7d288d;color #2/C:18 #707460;color #2/C:19 #6fde51;color #2/C:20 #35a960;color #2/C:21 #627d8d;color #2/C:22 #bb42ab;color #2/C:23 #327060;color #2/C:24 #a3357e;color #2/C:25 #28bd8d;color #2/C:26 #8f91ba;color #2/C:27 #c856d8;color #2/C:28 #795760;color #2/C:29 #c067c9;color #2/C:30 #669b6f;color #2/C:31 #adabd8;color #2/C:32 #889d51;color #2/C:33 #c18f9c;color #2/C:34 #26bd51;color #2/C:35 #55cdba;color #2/C:36 #7e1a60;color #2/C:37 #238451;color #2/C:38 #68678d;color #2/C:39 #6da451;color #2/C:40 #a315d8;color #2/C:41 #88256f;color #2/C:42 #1f17ba;color #2/C:43 #4a456f;color #2/C:44 #6da051;color #2/C:45 #a4bfc9;color #2/C:46 #9557ba;color #2/C:47 #d6d0ba;color #2/C:48 #791d60;color #2/C:49 #e2e1ab;color #2/C:50 #1c616f;color #2/C:51 #7fda6f;color #2/C:52 #8e907e;color #2/C:53 #77559c;color #2/C:54 #c4bf8d;color #2/C:55 #77759c;color #2/C:56 #1658d8;color #2/C:57 #add1d8;color #2/C:58 #aa5aba;color #2/C:59 #95d3ba;color #2/C:60 #adadd8;color #2/C:61 #aa36ba;color #2/C:62 #95afba;color #2/C:63 #aa74d8;color #2/C:64 #731bd8;color #2/C:65 #442b6f;color #2/C:66 #8f1dba;color #2/C:67 #882d51;color #2/C:68 #9b2eab;color #2/C:69 #764d51;color #2/C:70 #6adb51;color #2/C:71 #359160;color #2/C:72 #e283ab;color #2/C:73 #ddb160;color #2/C:74 #cab2ba;color #2/C:75 #5559ba;color #2/C:76 #8a876f;color #2/C:77 #c76aab;color #2/C:78 #62a76f;color #2/C:79 #793f60;color #2/C:80 #23be51;color #2/C:81 #bab09c;color #2/C:82 #99397e;color #2/C:83 #a42bc9;color #2/C:84 #53597e;color #2/C:85 #165ad8;color #2/C:86 #9d888d;color #2/C:87 #d04dab;color #2/C:88 #b1d5ba;color #2/C:89 #c66dab;color #2/C:90 #44a151;color #2/C:91 #df5760;color #2/C:92 #66df6f;color #2/C:93 #cf1dd8;color #2/C:94 #a269ab;color #2/C:95 #551fba;color #2/C:96 #e4a7c9;color #3/A:1 #1f5c8b;color #3/A:2 #a68a40;color #3/A:3 #5f3140;color #3/A:4 #76147c;color #3/A:5 #9d5140;color #3/A:6 #6c8ed6;color #3/A:7 #37804f;color #3/A:8 #8edb31;color #3/A:9 #7b64e5;color #3/A:10 #ab2140;color #3/A:11 #a89a40;color #3/A:12 #b53231;color #3/A:13 #7e247c;color #3/A:14 #6125d6;color #3/A:15 #a2265e;color #3/A:16 #97bd7c;color #3/A:17 #aa556d;color #3/A:18 #a9a140;color #3/A:19 #9c3931;color #3/A:20 #9e407c;color #3/A:21 #8faa6d;color #3/A:22 #166f8b;color #3/A:23 #9bd97c;color #3/A:24 #76dad6;color #3/A:25 #cd90e5;color #3/A:26 #2628d6;color #3/A:27 #97ce31;color #3/A:28 #e2c07c;color #3/A:29 #933a4f;color #3/A:30 #cf328b;color #3/A:31 #a27e5e;color #3/A:32 #b5ca31;color #3/A:33 #946222;color #3/A:34 #8f546d;color #3/A:35 #28a040;color #3/A:36 #ab4740;color #3/A:37 #8c1b6d;color #3/A:38 #95946d;color #3/A:39 #d63b6d;color #3/A:40 #76ba5e;color #3/A:41 #b5524f;color #3/A:42 #8880d6;color #3/A:43 #b3ae8b;color #3/A:44 #9acd31;color #3/A:45 #77924f;color #3/A:46 #2cc0d6;color #3/A:47 #a9a340;color #3/A:48 #e2867c;color #3/A:49 #b5b431;color #3/A:50 #498e4f;color #3/A:51 #64627c;color #3/A:52 #85188b;color #3/A:53 #e4827c;color #3/A:54 #1f1a6d;color #3/A:55 #a4a27c;color #3/A:56 #cdb2e5;color #3/A:57 #60a45e;color #3/A:58 #7d2d40;color #3/A:59 #80c45e;color #3/A:60 #444422;color #3/A:61 #7ddb40;color #3/A:62 #688240;color #3/A:63 #1fbfd6;color #3/A:64 #46c05e;color #3/A:65 #71584f;color #3/A:66 #2686d6;color #3/A:67 #353ce5;color #3/A:68 #c85b8b;color #3/A:69 #a37a31;color #3/A:70 #3518e5;color #3/A:71 #4882d6;color #3/A:72 #b55631;color #3/A:73 #74487c;color #3/A:74 #6149d6;color #3/A:75 #282c40;color #3/A:76 #211e8b;color #3/A:77 #22978b;color #3/A:78 #7998e5;color #3/A:79 #a66c40;color #3/A:80 #501931;color #3/A:81 #15dd7c;color #3/A:82 #ca756d;color #3/A:83 #3b94e5;color #3/A:84 #262cd6;color #3/A:85 #7fc322;color #3/A:86 #a88840;color #3/A:87 #2b7a8b;color #3/A:88 #486cd6;color #3/A:89 #994031;color #3/A:90 #71ce31;color #3/A:91 #3a8440;color #3/A:92 #ffffff;color #3/A:93 #a2c25e;color #3/A:94 #cf968b;color #3/A:95 #28c440;color #3/A:96 #7b3ee5;color #3/A:97 #6aa8d6;color #4/A:2 #977b82;color #4/A:3 #683191;color #4/A:4 #7dc8af;color #4/A:5 #768dcd;color #4/A:6 #bb16af;color #4/A:7 #1c5373;color #4/A:8 #3727a0;color #4/A:9 #d0afaf;color #4/A:10 #6cb755;color #4/A:11 #8d7c73;color #4/A:12 #26d755;color #4/A:13 #1f15be;color #4/A:14 #7e3464;color #4/A:15 #df35be;color #4/A:16 #484555;color #4/A:17 #9764cd;color #4/A:18 #84a191;color #4/A:19 #c766af;color #4/A:20 #6f9a55;color #4/A:21 #9eb9cd;color #4/A:22 #531582;color #4/A:23 #707064;color #4/A:24 #9b80cd;color #4/A:25 #d0dbaf;color #4/A:26 #3773a0;color #4/A:27 #26a155;color #4/A:28 #414855;color #4/A:29 #e267cd;color #4/A:30 #c023cd;color #4/A:31 #b18dbe;color #4/A:32 #84d991;color #4/A:33 #1fadbe;color #4/A:34 #bc63cd;color #4/A:35 #ad19dc;color #4/A:36 #6483cd;color #4/A:37 #c9deaf;color #4/A:38 #aab2dc;color #4/A:39 #59d182;color #4/A:40 #6d6055;color #4/A:41 #1cd955;color #4/A:42 #b5cba0;color #4/A:43 #e281af;color #4/A:44 #9537be;color #4/A:45 #d6b0be;color #4/A:46 #3bcf64;color #4/A:47 #2c6755;color #4/A:48 #e586cd;color #4/A:49 #e22dcd;color #4/A:50 #e29daf;color #4/A:51 #4935a0;color #4/A:52 #caccbe;color #4/A:53 #d573be;color #4/A:54 #e229cd;color #4/A:55 #b55782;color #4/A:56 #e449cd;color #4/A:57 #614a55;color #4/A:58 #9e69cd;color #4/A:59 #5f8873;color #4/A:60 #958fbe;color #4/A:61 #9e45cd;color #4/A:62 #975564;color #4/A:63 #1cdd73;color #4/A:64 #5ba291;color #4/A:65 #bedf55;color #4/A:66 #359564;color #4/A:67 #262d55;color #4/A:68 #711fa0;color #4/A:69 #505c64;color #4/A:70 #662773;color #4/A:71 #d319be;color #4/A:72 #e2a1cd;color #4/A:73 #b5cf82;color #4/A:74 #88b2be;color #4/A:75 #bb4aaf;color #4/A:76 #dc8773;color #4/A:77 #d579be;color #4/A:78 #7c9864;color #4/A:79 #9d6c91;color #4/A:80 #79cd64;color #4/A:81 #aa1adc;color #4/A:82 #ab4891;color #4/A:83 #1ca373;color #4/A:84 #8b4a73;color #4/A:85 #802daf;color #4/A:86 #d9c4cd;color #4/A:87 #c64daf;color #4/A:88 #857b64;color #4/A:89 #a26daf;color #4/A:90 #c629af;color #4/A:91 #adb1be;color #4/A:92 #5849af;color #4/A:93 #93b3a0;color #4/A:94 #48e155;color #4/A:95 #93d3a0;color #4/A:96 #dc4d73;color #4/A:97 #d53fbe;color #4/A:98 #6a4f55")
|
|---|
| 83 | #print(parser.pretty())
|
|---|
| 84 | t2 = time()
|
|---|
| 85 | print("Time to generate parser:", t1 - t0)
|
|---|
| 86 | print("Time to apply parser:", t2 - t1)
|
|---|