pyparsing 3.2.1__tar.gz → 3.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. {pyparsing-3.2.1 → pyparsing-3.2.2}/CHANGES +84 -2
  2. {pyparsing-3.2.1 → pyparsing-3.2.2}/PKG-INFO +4 -3
  3. {pyparsing-3.2.1 → pyparsing-3.2.2}/README.rst +2 -2
  4. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/HowToUsePyparsing.rst +5 -3
  5. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_3_2.rst +1 -1
  6. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/README.md +17 -4
  7. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/adventureEngine.py +7 -2
  8. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/adventure_game_parser_diagram.html +62 -46
  9. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/bigquery_view_parser.py +1 -1
  10. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/complex_chemical_formulas.py +2 -1
  11. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/complex_chemical_formulas_diagram.html +2 -2
  12. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/delta_time_diagram.html +44 -90
  13. pyparsing-3.2.2/examples/ebnf.py +185 -0
  14. pyparsing-3.2.2/examples/ebnf_diagram.html +656 -0
  15. pyparsing-3.2.2/examples/ebnf_number_parser_diagram.html +531 -0
  16. pyparsing-3.2.2/examples/ebnf_number_words.py +77 -0
  17. pyparsing-3.2.2/examples/ebnftest.py +59 -0
  18. pyparsing-3.2.2/examples/infix_math_parser.py +172 -0
  19. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/number_words.py +26 -21
  20. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/number_words_diagram.html +149 -122
  21. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/tag_metadata.py +5 -1
  22. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/__init__.py +2 -2
  23. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/actions.py +1 -1
  24. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/core.py +198 -125
  25. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/diagram/__init__.py +14 -4
  26. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/exceptions.py +5 -6
  27. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/helpers.py +31 -13
  28. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/results.py +1 -1
  29. pyparsing-3.2.2/pyparsing/tools/cvt_pyparsing_pep8_names.py +116 -0
  30. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/util.py +50 -10
  31. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyproject.toml +1 -0
  32. pyparsing-3.2.2/tests/__init__.py +0 -0
  33. pyparsing-3.2.2/tests/test_pep8_converter.py +631 -0
  34. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_unit.py +200 -68
  35. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_util.py +48 -1
  36. {pyparsing-3.2.1 → pyparsing-3.2.2}/tox.ini +3 -3
  37. pyparsing-3.2.1/examples/ebnf.py +0 -173
  38. pyparsing-3.2.1/examples/ebnftest.py +0 -75
  39. {pyparsing-3.2.1 → pyparsing-3.2.2}/.coveragerc +0 -0
  40. {pyparsing-3.2.1 → pyparsing-3.2.2}/.gitignore +0 -0
  41. {pyparsing-3.2.1 → pyparsing-3.2.2}/.pre-commit-config.yaml +0 -0
  42. {pyparsing-3.2.1 → pyparsing-3.2.2}/BUILDING.md +0 -0
  43. {pyparsing-3.2.1 → pyparsing-3.2.2}/CODE_OF_CONDUCT.rst +0 -0
  44. {pyparsing-3.2.1 → pyparsing-3.2.2}/CONTRIBUTING.md +0 -0
  45. {pyparsing-3.2.1 → pyparsing-3.2.2}/LICENSE +0 -0
  46. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/CODE_OF_CONDUCT.rst +0 -0
  47. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/Makefile +0 -0
  48. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/_static/pyparsingClassDiagram_1.5.2.jpg +0 -0
  49. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/_static/pyparsingClassDiagram_3.0.9.jpg +0 -0
  50. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/_static/sql_railroad.html +0 -0
  51. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/conf.py +0 -0
  52. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/index.rst +0 -0
  53. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/make_sphinx_docs.bat +0 -0
  54. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/modules.rst +0 -0
  55. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/pyparsing.rst +0 -0
  56. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/pyparsing_class_diagram.puml +0 -0
  57. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_3_0_0.rst +0 -0
  58. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_3_1.rst +0 -0
  59. {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_x_x_template.rst.txt +0 -0
  60. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/AcManForm.dfm +0 -0
  61. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/LAparser.py +0 -0
  62. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/Setup.ini +0 -0
  63. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/SimpleCalc.py +0 -0
  64. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/SingleForm.dfm +0 -0
  65. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/TAP.py +0 -0
  66. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/TAP_diagram.html +0 -0
  67. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/__init__.py +0 -0
  68. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/antlr_grammar.py +0 -0
  69. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/antlr_grammar_diagram.html +0 -0
  70. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/antlr_grammar_tests.py +0 -0
  71. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/apicheck.py +0 -0
  72. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/apicheck_diagram.html +0 -0
  73. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/bf.py +0 -0
  74. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/bf_diagram.html +0 -0
  75. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/booleansearchparser.py +0 -0
  76. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/btpyparse.py +0 -0
  77. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/builtin_parse_action_demo.py +0 -0
  78. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/cLibHeader.py +0 -0
  79. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/chemical_formulas.html +0 -0
  80. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/chemical_formulas.py +0 -0
  81. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/commasep.py +0 -0
  82. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/configParse.py +0 -0
  83. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/cpp_enum_parser.py +0 -0
  84. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/cuneiform_python.py +0 -0
  85. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/datetime_parse_actions.py +0 -0
  86. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/decaf_parser.py +0 -0
  87. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/decaf_parser_diagram.html +0 -0
  88. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/delta_time.py +0 -0
  89. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dfmparse.py +0 -0
  90. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dhcpd_leases_parser.py +0 -0
  91. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dictExample.py +0 -0
  92. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dictExample2.py +0 -0
  93. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/directx_x_file_parser.html +0 -0
  94. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/directx_x_file_parser.py +0 -0
  95. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/email_address_parser.py +0 -0
  96. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/eval_arith.py +0 -0
  97. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/excel_expr.py +0 -0
  98. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/fourFn.py +0 -0
  99. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/gen_ctypes.py +0 -0
  100. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/getNTPserversNew.py +0 -0
  101. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/greeting.py +0 -0
  102. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/greetingInGreek.py +0 -0
  103. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/greetingInKorean.py +0 -0
  104. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/groupUsingListAllMatches.py +0 -0
  105. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/hola_mundo.py +0 -0
  106. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/html_stripper.py +0 -0
  107. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/html_table_parser.py +0 -0
  108. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/httpServerLogParser.py +0 -0
  109. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/idlParse.py +0 -0
  110. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/include_preprocessor.py +0 -0
  111. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/indentedGrammarExample.py +0 -0
  112. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/indented_block_example.py +0 -0
  113. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/inv_regex.py +0 -0
  114. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/javascript_grammar.g +0 -0
  115. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/jsonParser.py +0 -0
  116. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/left_recursion.py +0 -0
  117. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lineno_example.py +0 -0
  118. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/listAllMatches.py +0 -0
  119. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lox_parser.py +0 -0
  120. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lox_parser_diagram.html +0 -0
  121. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lua_parser.py +0 -0
  122. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lua_parser_diagram.html +0 -0
  123. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lucene_grammar.py +0 -0
  124. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lucene_grammar_diagram.html +0 -0
  125. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/macro_expander.py +0 -0
  126. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/make_diagram.py +0 -0
  127. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/matchPreviousDemo.py +0 -0
  128. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mongodb_query_expression.html +0 -0
  129. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mongodb_query_expression.py +0 -0
  130. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mongodb_query_expression_step_0.py +0 -0
  131. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mozilla.ics +0 -0
  132. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mozillaCalendarParser.py +0 -0
  133. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/nested.py +0 -0
  134. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/nested_markup.py +0 -0
  135. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/numerics.py +0 -0
  136. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/oc.py +0 -0
  137. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/one_to_ninety_nine.py +0 -0
  138. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parseTabularData.py +0 -0
  139. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parse_python_value.html +0 -0
  140. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parse_python_value.py +0 -0
  141. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parse_results_sum_example.py +0 -0
  142. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/partial_gene_match.py +0 -0
  143. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/pgn.py +0 -0
  144. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/position.py +0 -0
  145. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/protobuf_parser.py +0 -0
  146. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/pythonGrammarParser.py +0 -0
  147. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/railroad_diagram_demo.py +0 -0
  148. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/range_check.py +0 -0
  149. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/readJson.py +0 -0
  150. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/removeLineBreaks.py +0 -0
  151. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/roman_numerals.py +0 -0
  152. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/roman_numerals_diagram.html +0 -0
  153. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/rosettacode.py +0 -0
  154. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/rosettacode_diagram.html +0 -0
  155. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/scanExamples.py +0 -0
  156. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/searchParserAppDemo.py +0 -0
  157. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/searchparser.py +0 -0
  158. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/select_parser.py +0 -0
  159. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/sexpParser.py +0 -0
  160. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/shapes.py +0 -0
  161. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleArith.py +0 -0
  162. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleBool.py +0 -0
  163. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleSQL.py +0 -0
  164. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleWiki.py +0 -0
  165. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/snmp_api.h +0 -0
  166. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/sql2dot.py +0 -0
  167. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/stackish.py +0 -0
  168. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/documentSignoffDemo.py +0 -0
  169. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/documentsignoffstate.pystate +0 -0
  170. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/libraryBookDemo.py +0 -0
  171. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/librarybookstate.pystate +0 -0
  172. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/statemachine.py +0 -0
  173. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/trafficLightDemo.py +0 -0
  174. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/trafficlightstate.pystate +0 -0
  175. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/vending_machine.py +0 -0
  176. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/video_demo.py +0 -0
  177. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/videostate.pystate +0 -0
  178. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/tag_emitter.py +0 -0
  179. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/tag_metadata_diagram.html +0 -0
  180. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/test_bibparse.py +0 -0
  181. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/unicode_denormalizer.py +0 -0
  182. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/urlExtractor.py +0 -0
  183. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/urlExtractorNew.py +0 -0
  184. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/verilog_parse.py +0 -0
  185. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/withAttribute.py +0 -0
  186. {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/wordsToNum.py +0 -0
  187. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/common.py +0 -0
  188. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/py.typed +0 -0
  189. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/testing.py +0 -0
  190. {pyparsing-3.2.1/tests → pyparsing-3.2.2/pyparsing/tools}/__init__.py +0 -0
  191. {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/unicode.py +0 -0
  192. {pyparsing-3.2.1 → pyparsing-3.2.2}/readthedocs.yaml +0 -0
  193. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/README.md +0 -0
  194. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/diag_embed.html +0 -0
  195. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/diag_no_embed.html +0 -0
  196. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/json_parser_tests.py +0 -0
  197. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/karthik.ini +0 -0
  198. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/mypy-ignore-cases/forward_methods.py +0 -0
  199. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/parsefiletest_input_file.txt +0 -0
  200. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/requirements.txt +0 -0
  201. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_diagram.py +0 -0
  202. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_examples.py +0 -0
  203. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_matplotlib_cases.py +0 -0
  204. {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_simple_unit.py +0 -0
@@ -7,10 +7,92 @@ RELEASE PLANNING NOTES:
7
7
  In the pyparsing release 3.3.0, use of many of the pre-PEP8 methods (such as
8
8
  `ParserElement.parseString`) will start to raise `DeprecationWarnings`. I plan to
9
9
  completely drop the pre-PEP8 methods in pyparsing 4.0, though we won't see that release
10
- until some time in 2025. So there is plenty of time to convert existing parsers to
10
+ until some time in 2026. So there is plenty of time to convert existing parsers to
11
11
  the new function names before the old functions are completely removed. (Big help from
12
12
  Devin J. Pohly in structuring the code to enable this peaceful transition.)
13
13
 
14
+ ===========================================================================================
15
+ The version 3.3.0 release will begin emitting `DeprecationWarnings` for pyparsing methods
16
+ that have been renamed to PEP8-compliant names (introduced in pyparsing 3.0.0, in August,
17
+ 2021, with legacy names retained as aliases). In preparation, I have added in pyparsing
18
+ 3.2.2 a utility for finding and replacing the legacy method names with the new names.
19
+ This utility is located at `pyparsing/tools/cvt_pep8_names.py`. This script will scan all
20
+ Python files specified on the command line, and if the `-u` option is selected, will
21
+ replace all occurrences of the old method names with the new PEP8-compliant names,
22
+ updating the files in place.
23
+
24
+ Here is an example that converts all the files in the pyparsing `/examples` directory:
25
+
26
+ python -m pyparsing.tools.cvt_pyparsing_pep8_names -u examples/*.py
27
+
28
+ The new names are compatible with pyparsing versions 3.0.0 and later.
29
+ ===========================================================================================
30
+
31
+
32
+ Required Python versions by pyparsing version
33
+ ---------------------------------------------
34
+
35
+ +--------------------------------------------------+-------------------+
36
+ | pyparsing version | Required Python |
37
+ +==================================================+===================+
38
+ | 3.2.0 - 3.2.2 | 3.9 or later |
39
+ | 3.0.8 - 3.1.4 | 3.6.8 or later |
40
+ | 3.0.0 - 3.0.7 (these versions are discouraged) | 3.6 or later |
41
+ | 2.4.7 | 2.7 or later |
42
+ | 1.5.7 | 2.6 - 2.7 |
43
+ +--------------------------------------------------+-------------------+
44
+
45
+
46
+ Version 3.2.2 - March, 2025
47
+ ---------------------------
48
+ - Released `cvt_pyparsing_pep8_names.py` conversion utility to upgrade pyparsing-based
49
+ programs and libraries that use legacy camelCase names to use the new PEP8-compliant
50
+ snake_case method names. The converter can also be imported into other scripts as
51
+
52
+ from pyparsing.tools.cvt_pyparsing_pep8_names import pep8_converter
53
+
54
+ - Fixed bug in `nested_expr` where nested contents were stripped of whitespace when
55
+ the default whitespace characters were cleared (raised in this StackOverflow
56
+ question https://stackoverflow.com/questions/79327649 by Ben Alan). Also addressed
57
+ bug in resolving PEP8 compliant argument name and legacy argument name.
58
+
59
+ - Fixed bug in `rest_of_line` and the underlying `Regex` class, in which matching a
60
+ pattern that could match an empty string (such as `".*"` or `"[A-Z]*"` would not raise
61
+ a `ParseException` at or beyond the end of the input string. This could cause an
62
+ infinite parsing loop when parsing `rest_of_line` at the end of the input string.
63
+ Reported by user Kylotan, thanks! (Issue #593)
64
+
65
+ - Enhancements and extra input validation for `pyparsing.util.make_compressed_re` - see
66
+ usage in `examples/complex_chemical_formulas.py` and result in the generated railroad
67
+ diagram `examples/complex_chemical_formulas_diagram.html`. Properly escapes characters
68
+ like "." and "*" that have special meaning in regular expressions.
69
+
70
+ - Fixed bug in `one_of()` to properly escape characters that are regular expression markers
71
+ (such as '*', '+', '?', etc.) before building the internal regex.
72
+
73
+ - Better exception message for `MatchFirst` and `Or` expressions, showing all alternatives
74
+ rather than just the first one. Fixes Issue #592, reported by Focke, thanks!
75
+
76
+ - Added return type annotation of "-> None" for all `__init__()` methods, to satisfy
77
+ `mypy --strict` type checking. PR submitted by FeRD, thank you!
78
+
79
+ - Added optional argument `show_hidden` to `create_diagram` to show
80
+ elements that are used internally by pyparsing, but are not part of the actual
81
+ parser grammar. For instance, the `Tag` class can insert values into the parsed
82
+ results but it does not actually parse any input, so by default it is not included
83
+ in a railroad diagram. By calling `create_diagram` with `show_hidden` = `True`,
84
+ these internal elements will be included. (You can see this in the tag_metadata.py
85
+ script in the examples directory.)
86
+
87
+ - Fixed bug in `number_words.py` example. Also added `ebnf_number_words.py` to demonstrate
88
+ using the `ebnf.py` EBNF parser generator to build a similar parser directly from
89
+ EBNF.
90
+
91
+ - Fixed syntax warning raised in `bigquery_view_parser.py`, invalid escape sequence "\s".
92
+ Reported by sameer-google, nice catch! (Issue #598)
93
+
94
+ - Added support for Python 3.14.
95
+
14
96
 
15
97
  Version 3.2.1 - December, 2024
16
98
  ------------------------------
@@ -31,7 +113,7 @@ Version 3.2.1 - December, 2024
31
113
 
32
114
  - Added generated diagrams for many of the examples.
33
115
 
34
- - Replaced old examples/0README.html file with examples/README.md file.
116
+ - Replaced old `examples/0README.html` file with `examples/README.md` file.
35
117
 
36
118
 
37
119
  Version 3.2.0 - October, 2024
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyparsing
3
- Version: 3.2.1
3
+ Version: 3.2.2
4
4
  Summary: pyparsing module - Classes and methods to define and execute parsing grammars
5
5
  Author-email: Paul McGuire <ptmcg.gm+pyparsing@gmail.com>
6
6
  Requires-Python: >=3.9
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Programming Language :: Python :: 3 :: Only
21
22
  Classifier: Programming Language :: Python :: Implementation :: CPython
22
23
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -56,7 +57,7 @@ Here is a program to parse ``"Hello, World!"`` (or any greeting of the form
56
57
  from pyparsing import Word, alphas
57
58
  greet = Word(alphas) + "," + Word(alphas) + "!"
58
59
  hello = "Hello, World!"
59
- print(hello, "->", greet.parseString(hello))
60
+ print(hello, "->", greet.parse_string(hello))
60
61
 
61
62
  The program outputs the following::
62
63
 
@@ -66,7 +67,7 @@ The Python representation of the grammar is quite readable, owing to the
66
67
  self-explanatory class names, and the use of '+', '|' and '^' operator
67
68
  definitions.
68
69
 
69
- The parsed results returned from ``parseString()`` is a collection of type
70
+ The parsed results returned from ``parse_string()`` is a collection of type
70
71
  ``ParseResults``, which can be accessed as a
71
72
  nested list, a dictionary, or an object with named attributes.
72
73
 
@@ -26,7 +26,7 @@ Here is a program to parse ``"Hello, World!"`` (or any greeting of the form
26
26
  from pyparsing import Word, alphas
27
27
  greet = Word(alphas) + "," + Word(alphas) + "!"
28
28
  hello = "Hello, World!"
29
- print(hello, "->", greet.parseString(hello))
29
+ print(hello, "->", greet.parse_string(hello))
30
30
 
31
31
  The program outputs the following::
32
32
 
@@ -36,7 +36,7 @@ The Python representation of the grammar is quite readable, owing to the
36
36
  self-explanatory class names, and the use of '+', '|' and '^' operator
37
37
  definitions.
38
38
 
39
- The parsed results returned from ``parseString()`` is a collection of type
39
+ The parsed results returned from ``parse_string()`` is a collection of type
40
40
  ``ParseResults``, which can be accessed as a
41
41
  nested list, a dictionary, or an object with named attributes.
42
42
 
@@ -998,7 +998,7 @@ Exception classes and Troubleshooting
998
998
 
999
999
  expr = pp.Word(pp.alphanums).set_name("word").set_debug()
1000
1000
  print(ppt.with_line_numbers(data))
1001
- expr[...].parseString(data)
1001
+ expr[...].parse_string(data)
1002
1002
 
1003
1003
  prints::
1004
1004
 
@@ -1155,7 +1155,7 @@ Helper methods
1155
1155
 
1156
1156
  expr = infix_notation(int_expr,
1157
1157
  [
1158
- (one_of("+ -"), 2, opAssoc.LEFT),
1158
+ (one_of("+ -"), 2, OpAssoc.LEFT),
1159
1159
  ],
1160
1160
  lpar="<",
1161
1161
  rpar=">"
@@ -1170,7 +1170,7 @@ Helper methods
1170
1170
 
1171
1171
  expr = infix_notation(int_expr,
1172
1172
  [
1173
- (one_of("+ -"), 2, opAssoc.LEFT),
1173
+ (one_of("+ -"), 2, OpAssoc.LEFT),
1174
1174
  ],
1175
1175
  lpar=Literal("<"),
1176
1176
  rpar=Literal(">")
@@ -1489,6 +1489,8 @@ This will result in the railroad diagram being written to ``street_address_diagr
1489
1489
 
1490
1490
  - ``show_groups`` - bool flag whether groups should be highlighted with an unlabeled surrounding box
1491
1491
 
1492
+ - ``show_hidden`` - bool flag whether internal pyparsing elements that are normally omitted in diagrams should be shown (default=False)
1493
+
1492
1494
  - ``embed`` - bool flag whether generated HTML should omit <HEAD>, <BODY>, and <DOCTYPE> tags to embed
1493
1495
  the resulting HTML in an enclosing HTML source (such as PyScript HTML)
1494
1496
 
@@ -117,7 +117,7 @@ New / Enhanced Examples
117
117
  Robert Nystrom's "Crafting Interpreters" (http://craftinginterpreters.com/).
118
118
 
119
119
  - Added ``complex_chemical_formulas.py`` example, to add parsing capability for
120
- formulas such as "3(C₆H₅OH)₂".
120
+ formulas such as "Ba(BrO₃)₂·H₂O".
121
121
 
122
122
  - Updated ``tag_emitter.py`` to use new ``Tag`` class, introduced in pyparsing
123
123
  3.1.3.
@@ -3,6 +3,16 @@
3
3
  This directory contains a number of examples of parsers created using pyparsing. They fall into a few general
4
4
  categories (several examples include supporting railroad diagrams):
5
5
 
6
+ <!-- TOC -->
7
+ * [Pyparsing tutorial and language feature demonstrations](#pyparsing-tutorial-and-language-feature-demonstrations)
8
+ * [Language parsers](#language-parsers)
9
+ * [Domain Specific Language parsers](#domain-specific-language-parsers)
10
+ * [Search and query language parsers](#search-and-query-language-parsers)
11
+ * [Data format parsers](#data-format-parsers)
12
+ * [Logical and arithmetic infix notation parsers and examples](#logical-and-arithmetic-infix-notation-parsers-and-examples)
13
+ * [Helpful utilities](#helpful-utilities)
14
+ <!-- TOC -->
15
+
6
16
  ## Pyparsing tutorial and language feature demonstrations
7
17
  * Hello World!
8
18
  * [greeting.py](./greeting.py)
@@ -18,7 +28,7 @@ categories (several examples include supporting railroad diagrams):
18
28
  * Unicode text handling
19
29
  * [tag_metadata.py](./tag_metadata.py) [(diagram)](./tag_metadata_diagram.html)
20
30
  * chemical formulas
21
- * [chemical_formula.py](./chemical_formula.py)
31
+ * [chemical_formulas.py](./chemical_formulas.py)
22
32
  * [complex_chemical_formulas.py](./complex_chemical_formulas.py)
23
33
  * API checker
24
34
  * [apicheck.py](./apicheck.py) [(diagram)](./apicheck_diagram.html)
@@ -59,12 +69,15 @@ categories (several examples include supporting railroad diagrams):
59
69
  * rosetta code
60
70
  * [rosettacode.py](./rosettacode.py) [(diagram)](./rosettacode_diagram.html)
61
71
  ## Domain Specific Language parsers
62
- * adventureEngine
72
+ * adventureEngine - interactive fiction parser and game runner
63
73
  * [adventureEngine.py](./adventureEngine.py) [(diagram)](./adventure_game_parser_diagram.html)
64
- * pgn
74
+ * pgn - Chess notation parser
65
75
  * [pgn.py](./pgn.py)
66
- * TAP
76
+ * TAP - Test results parser
67
77
  * [TAP.py](./TAP.py) [(diagram)](./TAP_diagram.html)
78
+ * EBNF - Extended Backus-Naur Format parser (and compiler to a running pyparsing parser)
79
+ * [ebnf.py](./ebnf.py) [(diagram)](./ebnf_diagram.html)
80
+ * [ebnf_number_words.py](./ebnf_number_words.py) [(diagram)](./ebnf_number_parser_diagram.html)
68
81
  ## Search and query language parsers
69
82
  * basic search
70
83
  * [searchparser.py](./searchparser.py) [demo](./searchParserAppDemo.py)
@@ -454,7 +454,7 @@ class Parser:
454
454
  quitVerb = pp.one_of("QUIT Q", caseless=True)
455
455
  lookVerb = pp.one_of("LOOK L", caseless=True)
456
456
  doorsVerb = pp.CaselessLiteral("DOORS")
457
- helpVerb = pp.one_of("H HELP ?", caseless=True)
457
+ helpVerb = pp.one_of("H HELP ?", caseless=True).set_name("HELP | H | ?")
458
458
 
459
459
  itemRef = pp.OneOrMore(pp.Word(pp.alphas)).set_parse_action(self.validate_item_name).setName("item_ref")
460
460
  nDir = pp.one_of("N NORTH", caseless=True).set_parse_action(pp.replace_with("N"))
@@ -512,7 +512,12 @@ class Parser:
512
512
  )("command").set_name("command")
513
513
 
514
514
  with contextlib.suppress(Exception):
515
- parser.create_diagram("adventure_game_parser_diagram.html", vertical=2, show_groups=True)
515
+ parser.create_diagram(
516
+ "adventure_game_parser_diagram.html",
517
+ vertical=3,
518
+ show_groups=True,
519
+ show_results_names=True
520
+ )
516
521
 
517
522
  return parser
518
523
 
@@ -21,55 +21,71 @@
21
21
  <h1 class="railroad-heading" id="command-0019">command</h1>
22
22
  <div class="railroad-description"></div>
23
23
  <div class="railroad-svg">
24
- <svg class="railroad-diagram" height="530" viewBox="0 0 585.0 530" width="585.0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
24
+ <svg class="railroad-diagram" height="716" viewBox="0 0 615.0 716" width="615.0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
25
25
  <g transform="translate(.5 .5)">
26
26
  <g>
27
27
  <path d="M20 21v20m10 -20v20m-10 -10h20" /></g><path d="M40 31h10" /><g>
28
- <path d="M50 31h0.0" /><path d="M535.0 31h0.0" /><g>
29
- <path d="M50.0 31h0.0" /><path d="M535.0 31h0.0" /><path d="M50.0 31h20" /><g class="non-terminal ">
30
- <path d="M70.0 31h131.75" /><path d="M383.25 31h131.75" /><rect height="22" width="181.5" x="201.75" y="20"></rect><a xlink:href="#inventory-inv-i-0001"><text x="292.5" y="35">INVENTORY | INV | I</text><text x="292.5" y="35">INVENTORY | INV | I</text></a></g><path d="M515.0 31h20" /><path d="M50.0 31a10 10 0 0 1 10 10v19a10 10 0 0 0 10 10" /><g>
31
- <path d="M70.0 70h0.0" /><path d="M515.0 70h0.0" /><g class="non-terminal ">
32
- <path d="M70.0 70h0.0" /><path d="M149.5 70h0.0" /><rect height="22" width="79.5" x="70" y="59"></rect><a xlink:href="#use-u-0002"><text x="109.75" y="74">USE | U</text><text x="109.75" y="74">USE | U</text></a></g><path d="M149.5 70h10" /><path d="M159.5 70h10" /><g class="non-terminal ">
33
- <path d="M169.5 70h0.0" /><path d="M257.5 70h0.0" /><rect height="22" width="88" x="169.5" y="59"></rect><a xlink:href="#item-ref-0003"><text x="213.5" y="74">item_ref</text><text x="213.5" y="74">item_ref</text></a></g><path d="M257.5 70h10" /><g>
34
- <path d="M267.5 70h0.0" /><path d="M387.0 70h0.0" /><path d="M267.5 70a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10" /><g>
35
- <path d="M287.5 50h79.5" /></g><path d="M367.0 50a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><path d="M267.5 70h20" /><g class="non-terminal ">
36
- <path d="M287.5 70h0.0" /><path d="M367.0 70h0.0" /><rect height="22" width="79.5" x="287.5" y="59"></rect><a xlink:href="#in-on-0004"><text x="327.25" y="74">IN | ON</text><text x="327.25" y="74">IN | ON</text></a></g><path d="M367.0 70h20" /></g><g>
37
- <path d="M387.0 70h0.0" /><path d="M515.0 70h0.0" /><path d="M387.0 70a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10" /><g>
38
- <path d="M407.0 50h88.0" /></g><path d="M495.0 50a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><path d="M387.0 70h20" /><g class="non-terminal ">
39
- <path d="M407.0 70h0.0" /><path d="M495.0 70h0.0" /><rect height="22" width="88" x="407" y="59"></rect><a xlink:href="#item-ref-0003"><text x="451" y="74">item_ref</text><text x="451" y="74">item_ref</text></a></g><path d="M495.0 70h20" /></g></g><path d="M515.0 70a10 10 0 0 0 10 -10v-19a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v49a10 10 0 0 0 10 10" /><g>
40
- <path d="M70.0 100h124.5" /><path d="M390.5 100h124.5" /><g class="non-terminal ">
41
- <path d="M194.5 100h0.0" /><path d="M282.5 100h0.0" /><rect height="22" width="88" x="194.5" y="89"></rect><a xlink:href="#open-o-0005"><text x="238.5" y="104">OPEN | O</text><text x="238.5" y="104">OPEN | O</text></a></g><path d="M282.5 100h10" /><path d="M292.5 100h10" /><g class="non-terminal ">
42
- <path d="M302.5 100h0.0" /><path d="M390.5 100h0.0" /><rect height="22" width="88" x="302.5" y="89"></rect><a xlink:href="#item-ref-0003"><text x="346.5" y="104">item_ref</text><text x="346.5" y="104">item_ref</text></a></g></g><path d="M515.0 100a10 10 0 0 0 10 -10v-49a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v79a10 10 0 0 0 10 10" /><g>
43
- <path d="M70.0 130h116.0" /><path d="M399.0 130h116.0" /><g class="non-terminal ">
44
- <path d="M186.0 130h0.0" /><path d="M291.0 130h0.0" /><rect height="22" width="105" x="186" y="119"></rect><a xlink:href="#close-cl-0006"><text x="238.5" y="134">CLOSE | CL</text><text x="238.5" y="134">CLOSE | CL</text></a></g><path d="M291.0 130h10" /><path d="M301.0 130h10" /><g class="non-terminal ">
45
- <path d="M311.0 130h0.0" /><path d="M399.0 130h0.0" /><rect height="22" width="88" x="311" y="119"></rect><a xlink:href="#item-ref-0003"><text x="355" y="134">item_ref</text><text x="355" y="134">item_ref</text></a></g></g><path d="M515.0 130a10 10 0 0 0 10 -10v-79a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v109a10 10 0 0 0 10 10" /><g>
46
- <path d="M70.0 160h107.5" /><path d="M407.5 160h107.5" /><g class="non-terminal ">
47
- <path d="M177.5 160h0.0" /><path d="M299.5 160h0.0" /><rect height="22" width="122" x="177.5" y="149"></rect><a xlink:href="#drop-leave-0007"><text x="238.5" y="164">DROP | LEAVE</text><text x="238.5" y="164">DROP | LEAVE</text></a></g><path d="M299.5 160h10" /><path d="M309.5 160h10" /><g class="non-terminal ">
48
- <path d="M319.5 160h0.0" /><path d="M407.5 160h0.0" /><rect height="22" width="88" x="319.5" y="149"></rect><a xlink:href="#item-ref-0003"><text x="363.5" y="164">item_ref</text><text x="363.5" y="164">item_ref</text></a></g></g><path d="M515.0 160a10 10 0 0 0 10 -10v-109a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v139a10 10 0 0 0 10 10" /><g>
49
- <path d="M70.0 190h88.25" /><path d="M426.75 190h88.25" /><g>
50
- <path d="M158.25 190h0.0" /><path d="M328.75 190h0.0" /><path d="M158.25 190h20" /><g class="non-terminal ">
51
- <path d="M178.25 190h0.0" /><path d="M308.75 190h0.0" /><rect height="22" width="130.5" x="178.25" y="179"></rect><a xlink:href="#take-pickup-0008"><text x="243.5" y="194">TAKE | PICKUP</text><text x="243.5" y="194">TAKE | PICKUP</text></a></g><path d="M308.75 190h20" /><path d="M158.25 190a10 10 0 0 1 10 10v10a10 10 0 0 0 10 10" /><g>
52
- <path d="M178.25 220h9.75" /><path d="M188.0 220h10" /><g class="terminal ">
53
- <path d="M198.0 220h10.0" /><path d="M279.0 220h10.0" /><rect height="22" rx="10" ry="10" width="71" x="208" y="209"></rect><text x="243.5" y="224">&apos;PICK&apos;</text></g><path d="M289.0 220a10 10 0 0 1 10 10v0a10 10 0 0 1 -10 10h-91.0a10 10 0 0 0 -10 10v0a10 10 0 0 0 10 10" /><g class="terminal ">
54
- <path d="M198.0 260h18.5" /><path d="M270.5 260h18.5" /><rect height="22" rx="10" ry="10" width="54" x="216.5" y="249"></rect><text x="243.5" y="264">&apos;UP&apos;</text></g><path d="M289.0 260h10" /><path d="M299.0 260h9.75" /></g><path d="M308.75 260a10 10 0 0 0 10 -10v-50a10 10 0 0 1 10 -10" /></g><path d="M328.75 190h10" /><g class="non-terminal ">
55
- <path d="M338.75 190h0.0" /><path d="M426.75 190h0.0" /><rect height="22" width="88" x="338.75" y="179"></rect><a xlink:href="#item-ref-0003"><text x="382.75" y="194">item_ref</text><text x="382.75" y="194">item_ref</text></a></g></g><path d="M515.0 190a10 10 0 0 0 10 -10v-139a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v208a10 10 0 0 0 10 10" /><g>
56
- <path d="M70.0 259h66.0" /><path d="M449.0 259h66.0" /><g>
57
- <path d="M136.0 259h0.0" /><path d="M312.5 259h0.0" /><path d="M136.0 259a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10" /><g>
58
- <path d="M156.0 239h136.5" /></g><path d="M292.5 239a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><path d="M136.0 259h20" /><g>
59
- <path d="M156.0 259h0.0" /><path d="M292.5 259h0.0" /><path d="M156.0 259h20" /><g class="non-terminal ">
60
- <path d="M176.0 259h0.0" /><path d="M272.5 259h0.0" /><rect height="22" width="96.5" x="176" y="248"></rect><a xlink:href="#move-go-0009"><text x="224.25" y="263">MOVE | GO</text><text x="224.25" y="263">MOVE | GO</text></a></g><path d="M272.5 259h20" /></g><path d="M292.5 259h20" /></g><g>
61
- <path d="M312.5 259h0.0" /><path d="M449.0 259h0.0" /><path d="M312.5 259h20" /><g class="non-terminal ">
62
- <path d="M332.5 259h0.0" /><path d="M429.0 259h0.0" /><rect height="22" width="96.5" x="332.5" y="248"></rect><a xlink:href="#north-n-0010"><text x="380.75" y="263">NORTH | N</text><text x="380.75" y="263">NORTH | N</text></a></g><path d="M429.0 259h20" /><path d="M312.5 259a10 10 0 0 1 10 10v10a10 10 0 0 0 10 10" /><g class="non-terminal ">
63
- <path d="M332.5 289h0.0" /><path d="M429.0 289h0.0" /><rect height="22" width="96.5" x="332.5" y="278"></rect><a xlink:href="#south-s-0011"><text x="380.75" y="293">SOUTH | S</text><text x="380.75" y="293">SOUTH | S</text></a></g><path d="M429.0 289a10 10 0 0 0 10 -10v-10a10 10 0 0 1 10 -10" /><path d="M312.5 259a10 10 0 0 1 10 10v40a10 10 0 0 0 10 10" /><g class="non-terminal ">
64
- <path d="M332.5 319h4.25" /><path d="M424.75 319h4.25" /><rect height="22" width="88" x="336.75" y="308"></rect><a xlink:href="#east-e-0012"><text x="380.75" y="323">EAST | E</text><text x="380.75" y="323">EAST | E</text></a></g><path d="M429.0 319a10 10 0 0 0 10 -10v-40a10 10 0 0 1 10 -10" /><path d="M312.5 259a10 10 0 0 1 10 10v70a10 10 0 0 0 10 10" /><g class="non-terminal ">
65
- <path d="M332.5 349h4.25" /><path d="M424.75 349h4.25" /><rect height="22" width="88" x="336.75" y="338"></rect><a xlink:href="#west-w-0013"><text x="380.75" y="353">WEST | W</text><text x="380.75" y="353">WEST | W</text></a></g><path d="M429.0 349a10 10 0 0 0 10 -10v-70a10 10 0 0 1 10 -10" /></g></g><path d="M515.0 259a10 10 0 0 0 10 -10v-208a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v328a10 10 0 0 0 10 10" /><g class="non-terminal ">
66
- <path d="M70.0 379h178.5" /><path d="M336.5 379h178.5" /><rect height="22" width="88" x="248.5" y="368"></rect><a xlink:href="#look-l-0014"><text x="292.5" y="383">LOOK | L</text><text x="292.5" y="383">LOOK | L</text></a></g><path d="M515.0 379a10 10 0 0 0 10 -10v-328a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v358a10 10 0 0 0 10 10" /><g>
67
- <path d="M70.0 409h90.5" /><path d="M424.5 409h90.5" /><g class="non-terminal ">
68
- <path d="M160.5 409h0.0" /><path d="M316.5 409h0.0" /><rect height="22" width="156" x="160.5" y="398"></rect><a xlink:href="#examine-ex-x-0015"><text x="238.5" y="413">EXAMINE | EX | X</text><text x="238.5" y="413">EXAMINE | EX | X</text></a></g><path d="M316.5 409h10" /><path d="M326.5 409h10" /><g class="non-terminal ">
69
- <path d="M336.5 409h0.0" /><path d="M424.5 409h0.0" /><rect height="22" width="88" x="336.5" y="398"></rect><a xlink:href="#item-ref-0003"><text x="380.5" y="413">item_ref</text><text x="380.5" y="413">item_ref</text></a></g></g><path d="M515.0 409a10 10 0 0 0 10 -10v-358a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v388a10 10 0 0 0 10 10" /><g class="non-terminal ">
70
- <path d="M70.0 439h191.25" /><path d="M323.75 439h191.25" /><rect height="22" width="62.5" x="261.25" y="428"></rect><a xlink:href="#doors-0016"><text x="292.5" y="443">DOORS</text><text x="292.5" y="443">DOORS</text></a></g><path d="M515.0 439a10 10 0 0 0 10 -10v-388a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v418a10 10 0 0 0 10 10" /><g class="non-terminal ">
71
- <path d="M70.0 469h161.5" /><path d="M353.5 469h161.5" /><rect height="22" width="122" x="231.5" y="458"></rect><a xlink:href="#help-h-0017"><text x="292.5" y="473">HELP | H | ?</text><text x="292.5" y="473">HELP | H | ?</text></a></g><path d="M515.0 469a10 10 0 0 0 10 -10v-418a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v448a10 10 0 0 0 10 10" /><g class="non-terminal ">
72
- <path d="M70.0 499h178.5" /><path d="M336.5 499h178.5" /><rect height="22" width="88" x="248.5" y="488"></rect><a xlink:href="#quit-q-0018"><text x="292.5" y="503">QUIT | Q</text><text x="292.5" y="503">QUIT | Q</text></a></g><path d="M515.0 499a10 10 0 0 0 10 -10v-448a10 10 0 0 1 10 -10" /></g></g><path d="M535.0 31h10" /><path d="M 545.0 31 h 20 m -10 -10 v 20 m 10 -20 v 20"></path></g><style>/* <![CDATA[ */
28
+ <path d="M50 31h0.0" /><path d="M565.0 31h0.0" /><g>
29
+ <path d="M50.0 31h0.0" /><path d="M565.0 31h0.0" /><path d="M50.0 31h20" /><g class="non-terminal ">
30
+ <path d="M70.0 31h146.75" /><path d="M398.25 31h146.75" /><rect height="22" width="181.5" x="216.75" y="20"></rect><a xlink:href="#inventory-inv-i-0001"><text x="307.5" y="35">INVENTORY | INV | I</text><text x="307.5" y="35">INVENTORY | INV | I</text></a></g><path d="M545.0 31h20" /><path d="M50.0 31a10 10 0 0 1 10 10v43a10 10 0 0 0 10 10" /><g>
31
+ <path d="M70.0 94h0.0" /><path d="M545.0 94h0.0" /><g class="non-terminal ">
32
+ <path d="M70.0 94h0.0" /><path d="M149.5 94h0.0" /><rect height="22" width="79.5" x="70" y="83"></rect><a xlink:href="#use-u-0002"><text x="109.75" y="98">USE | U</text><text x="109.75" y="98">USE | U</text></a></g><path d="M149.5 94h10" /><path d="M159.5 94h10" /><g>
33
+ <path d="M169.5 94h0.0" /><path d="M277.5 94h0.0" /><rect class="group-box" height="38" rx="10" ry="10" width="108" x="169.5" y="75"></rect><g class="non-terminal ">
34
+ <path d="M169.5 94h10.0" /><path d="M267.5 94h10.0" /><rect height="22" width="88" x="179.5" y="83"></rect><a xlink:href="#item-ref-0003"><text x="223.5" y="98">item_ref</text><text x="223.5" y="98">item_ref</text></a></g><g class="non-terminal ">
35
+ <path d="M169.5 67h0.0" /><path d="M242.5 67h0.0" /><text class="comment" x="206" y="72">&apos;usedObj&apos;</text></g></g><path d="M277.5 94h10" /><g>
36
+ <path d="M287.5 94h0.0" /><path d="M407.0 94h0.0" /><path d="M287.5 94a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10" /><g>
37
+ <path d="M307.5 74h79.5" /></g><path d="M387.0 74a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><path d="M287.5 94h20" /><g class="non-terminal ">
38
+ <path d="M307.5 94h0.0" /><path d="M387.0 94h0.0" /><rect height="22" width="79.5" x="307.5" y="83"></rect><a xlink:href="#in-on-0004"><text x="347.25" y="98">IN | ON</text><text x="347.25" y="98">IN | ON</text></a></g><path d="M387.0 94h20" /></g><path d="M407.0 94h10" /><g>
39
+ <path d="M417.0 94h0.0" /><path d="M545.0 94h0.0" /><rect class="group-box" height="47" rx="10" ry="10" width="128" x="417" y="66"></rect><g>
40
+ <path d="M417.0 94h0.0" /><path d="M545.0 94h0.0" /><path d="M417.0 94a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10" /><g>
41
+ <path d="M437.0 74h88.0" /></g><path d="M525.0 74a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><path d="M417.0 94h20" /><g class="non-terminal ">
42
+ <path d="M437.0 94h0.0" /><path d="M525.0 94h0.0" /><rect height="22" width="88" x="437" y="83"></rect><a xlink:href="#item-ref-0003"><text x="481" y="98">item_ref</text><text x="481" y="98">item_ref</text></a></g><path d="M525.0 94h20" /></g><g class="non-terminal ">
43
+ <path d="M417.0 58h0.0" /><path d="M504.0 58h0.0" /><text class="comment" x="460.5" y="63">&apos;targetObj&apos;</text></g></g></g><path d="M545.0 94a10 10 0 0 0 10 -10v-43a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v105a10 10 0 0 0 10 10" /><g>
44
+ <path d="M70.0 156h129.5" /><path d="M415.5 156h129.5" /><g class="non-terminal ">
45
+ <path d="M199.5 156h0.0" /><path d="M287.5 156h0.0" /><rect height="22" width="88" x="199.5" y="145"></rect><a xlink:href="#open-o-0005"><text x="243.5" y="160">OPEN | O</text><text x="243.5" y="160">OPEN | O</text></a></g><path d="M287.5 156h10" /><path d="M297.5 156h10" /><g>
46
+ <path d="M307.5 156h0.0" /><path d="M415.5 156h0.0" /><rect class="group-box" height="38" rx="10" ry="10" width="108" x="307.5" y="137"></rect><g class="non-terminal ">
47
+ <path d="M307.5 156h10.0" /><path d="M405.5 156h10.0" /><rect height="22" width="88" x="317.5" y="145"></rect><a xlink:href="#item-ref-0003"><text x="361.5" y="160">item_ref</text><text x="361.5" y="160">item_ref</text></a></g><g class="non-terminal ">
48
+ <path d="M307.5 129h0.0" /><path d="M359.5 129h0.0" /><text class="comment" x="333.5" y="134">&apos;item&apos;</text></g></g></g><path d="M545.0 156a10 10 0 0 0 10 -10v-105a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v167a10 10 0 0 0 10 10" /><g>
49
+ <path d="M70.0 218h121.0" /><path d="M424.0 218h121.0" /><g class="non-terminal ">
50
+ <path d="M191.0 218h0.0" /><path d="M296.0 218h0.0" /><rect height="22" width="105" x="191" y="207"></rect><a xlink:href="#close-cl-0006"><text x="243.5" y="222">CLOSE | CL</text><text x="243.5" y="222">CLOSE | CL</text></a></g><path d="M296.0 218h10" /><path d="M306.0 218h10" /><g>
51
+ <path d="M316.0 218h0.0" /><path d="M424.0 218h0.0" /><rect class="group-box" height="38" rx="10" ry="10" width="108" x="316" y="199"></rect><g class="non-terminal ">
52
+ <path d="M316.0 218h10.0" /><path d="M414.0 218h10.0" /><rect height="22" width="88" x="326" y="207"></rect><a xlink:href="#item-ref-0003"><text x="370" y="222">item_ref</text><text x="370" y="222">item_ref</text></a></g><g class="non-terminal ">
53
+ <path d="M316.0 191h0.0" /><path d="M368.0 191h0.0" /><text class="comment" x="342" y="196">&apos;item&apos;</text></g></g></g><path d="M545.0 218a10 10 0 0 0 10 -10v-167a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v229a10 10 0 0 0 10 10" /><g>
54
+ <path d="M70.0 280h112.5" /><path d="M432.5 280h112.5" /><g class="non-terminal ">
55
+ <path d="M182.5 280h0.0" /><path d="M304.5 280h0.0" /><rect height="22" width="122" x="182.5" y="269"></rect><a xlink:href="#drop-leave-0007"><text x="243.5" y="284">DROP | LEAVE</text><text x="243.5" y="284">DROP | LEAVE</text></a></g><path d="M304.5 280h10" /><path d="M314.5 280h10" /><g>
56
+ <path d="M324.5 280h0.0" /><path d="M432.5 280h0.0" /><rect class="group-box" height="38" rx="10" ry="10" width="108" x="324.5" y="261"></rect><g class="non-terminal ">
57
+ <path d="M324.5 280h10.0" /><path d="M422.5 280h10.0" /><rect height="22" width="88" x="334.5" y="269"></rect><a xlink:href="#item-ref-0003"><text x="378.5" y="284">item_ref</text><text x="378.5" y="284">item_ref</text></a></g><g class="non-terminal ">
58
+ <path d="M324.5 253h0.0" /><path d="M376.5 253h0.0" /><text class="comment" x="350.5" y="258">&apos;item&apos;</text></g></g></g><path d="M545.0 280a10 10 0 0 0 10 -10v-229a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v291a10 10 0 0 0 10 10" /><g>
59
+ <path d="M70.0 342h0.75" /><path d="M544.25 342h0.75" /><g>
60
+ <path d="M70.75 342h0.0" /><path d="M426.25 342h0.0" /><path d="M70.75 342a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10h140.5" /><path d="M251.25 362h155.0a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10" /><path d="M70.75 342h10" /><g class="non-terminal ">
61
+ <path d="M80.75 342h10.0" /><path d="M221.25 342h10.0" /><rect height="22" width="130.5" x="90.75" y="331"></rect><a xlink:href="#take-pickup-0008"><text x="156" y="346">TAKE | PICKUP</text><text x="156" y="346">TAKE | PICKUP</text></a></g><path d="M231.25 342a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><path d="M231.25 322a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><g>
62
+ <path d="M251.25 342h10.0" /><path d="M406.25 342h10.0" /><g class="terminal ">
63
+ <path d="M261.25 342h0.0" /><path d="M332.25 342h0.0" /><rect height="22" rx="10" ry="10" width="71" x="261.25" y="331"></rect><text x="296.75" y="346">&apos;PICK&apos;</text></g><path d="M332.25 342h10" /><path d="M342.25 342h10" /><g class="terminal ">
64
+ <path d="M352.25 342h0.0" /><path d="M406.25 342h0.0" /><rect height="22" rx="10" ry="10" width="54" x="352.25" y="331"></rect><text x="379.25" y="346">&apos;UP&apos;</text></g></g><path d="M416.25 342h10" /></g><path d="M426.25 342h10" /><g>
65
+ <path d="M436.25 342h0.0" /><path d="M544.25 342h0.0" /><rect class="group-box" height="38" rx="10" ry="10" width="108" x="436.25" y="323"></rect><g class="non-terminal ">
66
+ <path d="M436.25 342h10.0" /><path d="M534.25 342h10.0" /><rect height="22" width="88" x="446.25" y="331"></rect><a xlink:href="#item-ref-0003"><text x="490.25" y="346">item_ref</text><text x="490.25" y="346">item_ref</text></a></g><g class="non-terminal ">
67
+ <path d="M436.25 315h0.0" /><path d="M488.25 315h0.0" /><text class="comment" x="462.25" y="320">&apos;item&apos;</text></g></g></g><path d="M545.0 342a10 10 0 0 0 10 -10v-291a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v354a10 10 0 0 0 10 10" /><g>
68
+ <path d="M70.0 405h96.0" /><path d="M449.0 405h96.0" /><g>
69
+ <path d="M166.0 405h0.0" /><path d="M302.5 405h0.0" /><path d="M166.0 405a10 10 0 0 0 10 -10v0a10 10 0 0 1 10 -10" /><g>
70
+ <path d="M186.0 385h96.5" /></g><path d="M282.5 385a10 10 0 0 1 10 10v0a10 10 0 0 0 10 10" /><path d="M166.0 405h20" /><g>
71
+ <path d="M186.0 405h0.0" /><path d="M282.5 405h0.0" /><g class="non-terminal ">
72
+ <path d="M186.0 405h0.0" /><path d="M282.5 405h0.0" /><rect height="22" width="96.5" x="186" y="394"></rect><a xlink:href="#move-go-0009"><text x="234.25" y="409">MOVE | GO</text><text x="234.25" y="409">MOVE | GO</text></a></g></g><path d="M282.5 405h20" /></g><path d="M302.5 405h10" /><g>
73
+ <path d="M312.5 405h0.0" /><path d="M449.0 405h0.0" /><rect class="group-box" height="128" rx="10" ry="10" width="136.5" x="312.5" y="386"></rect><g>
74
+ <path d="M312.5 405h0.0" /><path d="M449.0 405h0.0" /><path d="M312.5 405h20" /><g class="non-terminal ">
75
+ <path d="M332.5 405h0.0" /><path d="M429.0 405h0.0" /><rect height="22" width="96.5" x="332.5" y="394"></rect><a xlink:href="#north-n-0010"><text x="380.75" y="409">NORTH | N</text><text x="380.75" y="409">NORTH | N</text></a></g><path d="M429.0 405h20" /><path d="M312.5 405a10 10 0 0 1 10 10v10a10 10 0 0 0 10 10" /><g class="non-terminal ">
76
+ <path d="M332.5 435h0.0" /><path d="M429.0 435h0.0" /><rect height="22" width="96.5" x="332.5" y="424"></rect><a xlink:href="#south-s-0011"><text x="380.75" y="439">SOUTH | S</text><text x="380.75" y="439">SOUTH | S</text></a></g><path d="M429.0 435a10 10 0 0 0 10 -10v-10a10 10 0 0 1 10 -10" /><path d="M312.5 405a10 10 0 0 1 10 10v40a10 10 0 0 0 10 10" /><g class="non-terminal ">
77
+ <path d="M332.5 465h4.25" /><path d="M424.75 465h4.25" /><rect height="22" width="88" x="336.75" y="454"></rect><a xlink:href="#east-e-0012"><text x="380.75" y="469">EAST | E</text><text x="380.75" y="469">EAST | E</text></a></g><path d="M429.0 465a10 10 0 0 0 10 -10v-40a10 10 0 0 1 10 -10" /><path d="M312.5 405a10 10 0 0 1 10 10v70a10 10 0 0 0 10 10" /><g class="non-terminal ">
78
+ <path d="M332.5 495h4.25" /><path d="M424.75 495h4.25" /><rect height="22" width="88" x="336.75" y="484"></rect><a xlink:href="#west-w-0013"><text x="380.75" y="499">WEST | W</text><text x="380.75" y="499">WEST | W</text></a></g><path d="M429.0 495a10 10 0 0 0 10 -10v-70a10 10 0 0 1 10 -10" /></g><g class="non-terminal ">
79
+ <path d="M312.5 378h0.0" /><path d="M399.5 378h0.0" /><text class="comment" x="356" y="383">&apos;direction&apos;</text></g></g></g><path d="M545.0 405a10 10 0 0 0 10 -10v-354a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v482a10 10 0 0 0 10 10" /><g class="non-terminal ">
80
+ <path d="M70.0 533h193.5" /><path d="M351.5 533h193.5" /><rect height="22" width="88" x="263.5" y="522"></rect><a xlink:href="#look-l-0014"><text x="307.5" y="537">LOOK | L</text><text x="307.5" y="537">LOOK | L</text></a></g><path d="M545.0 533a10 10 0 0 0 10 -10v-482a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v536a10 10 0 0 0 10 10" /><g>
81
+ <path d="M70.0 587h95.5" /><path d="M449.5 587h95.5" /><g class="non-terminal ">
82
+ <path d="M165.5 587h0.0" /><path d="M321.5 587h0.0" /><rect height="22" width="156" x="165.5" y="576"></rect><a xlink:href="#examine-ex-x-0015"><text x="243.5" y="591">EXAMINE | EX | X</text><text x="243.5" y="591">EXAMINE | EX | X</text></a></g><path d="M321.5 587h10" /><path d="M331.5 587h10" /><g>
83
+ <path d="M341.5 587h0.0" /><path d="M449.5 587h0.0" /><rect class="group-box" height="38" rx="10" ry="10" width="108" x="341.5" y="568"></rect><g class="non-terminal ">
84
+ <path d="M341.5 587h10.0" /><path d="M439.5 587h10.0" /><rect height="22" width="88" x="351.5" y="576"></rect><a xlink:href="#item-ref-0003"><text x="395.5" y="591">item_ref</text><text x="395.5" y="591">item_ref</text></a></g><g class="non-terminal ">
85
+ <path d="M341.5 560h0.0" /><path d="M393.5 560h0.0" /><text class="comment" x="367.5" y="565">&apos;item&apos;</text></g></g></g><path d="M545.0 587a10 10 0 0 0 10 -10v-536a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v574a10 10 0 0 0 10 10" /><g class="non-terminal ">
86
+ <path d="M70.0 625h206.25" /><path d="M338.75 625h206.25" /><rect height="22" width="62.5" x="276.25" y="614"></rect><a xlink:href="#doors-0016"><text x="307.5" y="629">DOORS</text><text x="307.5" y="629">DOORS</text></a></g><path d="M545.0 625a10 10 0 0 0 10 -10v-574a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v604a10 10 0 0 0 10 10" /><g class="non-terminal ">
87
+ <path d="M70.0 655h176.5" /><path d="M368.5 655h176.5" /><rect height="22" width="122" x="246.5" y="644"></rect><a xlink:href="#help-h-0017"><text x="307.5" y="659">HELP | H | ?</text><text x="307.5" y="659">HELP | H | ?</text></a></g><path d="M545.0 655a10 10 0 0 0 10 -10v-604a10 10 0 0 1 10 -10" /><path d="M50.0 31a10 10 0 0 1 10 10v634a10 10 0 0 0 10 10" /><g class="non-terminal ">
88
+ <path d="M70.0 685h193.5" /><path d="M351.5 685h193.5" /><rect height="22" width="88" x="263.5" y="674"></rect><a xlink:href="#quit-q-0018"><text x="307.5" y="689">QUIT | Q</text><text x="307.5" y="689">QUIT | Q</text></a></g><path d="M545.0 685a10 10 0 0 0 10 -10v-634a10 10 0 0 1 10 -10" /></g></g><path d="M565.0 31h10" /><path d="M 575.0 31 h 20 m -10 -10 v 20 m 10 -20 v 20"></path></g><style>/* <![CDATA[ */
73
89
  svg.railroad-diagram {
74
90
  background-color:hsl(30,20%,95%);
75
91
  }
@@ -1709,7 +1709,7 @@ if __name__ == "__main__":
1709
1709
  ],
1710
1710
  ],
1711
1711
  [
1712
- """\
1712
+ r"""
1713
1713
  SELECT
1714
1714
  /* Replace white spaces in the title with underscores. */
1715
1715
  REGEXP_REPLACE(title, r'\s+', '_') AS regexp_title, revisions
@@ -46,7 +46,8 @@ table_of_elements: dict[str, float] = {
46
46
  # - subcript_int - an integer made up of subscript digits
47
47
  # (a normal integer definition uses the one defined in pyparsing.common)
48
48
  #
49
- element = pp.one_of(table_of_elements).set_name("element")
49
+ # element = pp.one_of(table_of_elements).set_name("element")
50
+ element = pp.Regex(pp.util.make_compressed_re(table_of_elements)).set_name("element")
50
51
  element.add_parse_action(lambda t: Counter([t[0]]))
51
52
 
52
53
  subscript_digits = "₀₁₂₃₄₅₆₇₈₉"
@@ -404,11 +404,11 @@
404
404
  <h1 class="railroad-heading" id="element-0003">element</h1>
405
405
  <div class="railroad-description"></div>
406
406
  <div class="railroad-svg">
407
- <svg class="railroad-diagram" height="62" viewBox="0 0 3001.5 62" width="3001.5" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
407
+ <svg class="railroad-diagram" height="62" viewBox="0 0 1803.0 62" width="1803.0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
408
408
  <g transform="translate(.5 .5)">
409
409
  <g>
410
410
  <path d="M20 21v20m10 -20v20m-10 -10h20" /></g><path d="M40 31h10" /><g class="terminal ">
411
- <path d="M50 31h0.0" /><path d="M2951.5 31h0.0" /><rect height="22" rx="10" ry="10" width="2901.5" x="50" y="20"></rect><text x="1500.75" y="35">He|Ho|Hf|Hg|Hs|H|Li|Be|Br|Ba|Bi|Bk|Bh|B|Cl|Ca|Cr|Co|Cu|Cd|Cs|Ce|Cm|Cf|Cn|C|Ne|Na|Ni|Nb|Nd|Np|No|Nh|N|Os|Og|O|Fe|Fr|Fm|Fl|F|Mg|Al|Si|Pd|Pr|Pm|Pt|Pb|Po|Pa|Pu|P|Sc|Se|Sr|Sn|Sb|Sm|Sg|S|Ar|Kr|K|Ti|V|Mn|Zn|Ga|Ge|As|Rb|Yb|Y|Zr|Mo|Tc|Ru|Rh|Ag|In|Te|Ir|I|Xe|La|Eu|Gd|Tb|Dy|Er|Tm|Lu|Ta|W|Re|Au|Tl|At|Rn|Ra|Ac|Th|U|Am|Es|Md|Lr|Rf|Db|Mt|Ds|Rg|Mc|Lv|Ts</text></g><path d="M2951.5 31h10" /><path d="M 2961.5 31 h 20 m -10 -10 v 20 m 10 -20 v 20"></path></g><style>/* <![CDATA[ */
411
+ <path d="M50 31h0.0" /><path d="M1753.0 31h0.0" /><rect height="22" rx="10" ry="10" width="1703" x="50" y="20"></rect><text x="901.5" y="35">A[cglmrstu]|B[aehikr]?|C[adeflmnorsu]?|D[bsy]|E[rsu]|F[elmr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airuv]|M[cdgnot]|N[abdehiop]?|O[gs]?|P[abdmortu]?|R[abefghnu]|S[bcegimnr]?|T[abcehilms]|U|V|W|Xe|Yb?|Z[nr]</text></g><path d="M1753.0 31h10" /><path d="M 1763.0 31 h 20 m -10 -10 v 20 m 10 -20 v 20"></path></g><style>/* <![CDATA[ */
412
412
  svg.railroad-diagram {
413
413
  background-color:hsl(30,20%,95%);
414
414
  }