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.
- {pyparsing-3.2.1 → pyparsing-3.2.2}/CHANGES +84 -2
- {pyparsing-3.2.1 → pyparsing-3.2.2}/PKG-INFO +4 -3
- {pyparsing-3.2.1 → pyparsing-3.2.2}/README.rst +2 -2
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/HowToUsePyparsing.rst +5 -3
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_3_2.rst +1 -1
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/README.md +17 -4
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/adventureEngine.py +7 -2
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/adventure_game_parser_diagram.html +62 -46
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/bigquery_view_parser.py +1 -1
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/complex_chemical_formulas.py +2 -1
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/complex_chemical_formulas_diagram.html +2 -2
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/delta_time_diagram.html +44 -90
- pyparsing-3.2.2/examples/ebnf.py +185 -0
- pyparsing-3.2.2/examples/ebnf_diagram.html +656 -0
- pyparsing-3.2.2/examples/ebnf_number_parser_diagram.html +531 -0
- pyparsing-3.2.2/examples/ebnf_number_words.py +77 -0
- pyparsing-3.2.2/examples/ebnftest.py +59 -0
- pyparsing-3.2.2/examples/infix_math_parser.py +172 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/number_words.py +26 -21
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/number_words_diagram.html +149 -122
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/tag_metadata.py +5 -1
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/__init__.py +2 -2
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/actions.py +1 -1
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/core.py +198 -125
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/diagram/__init__.py +14 -4
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/exceptions.py +5 -6
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/helpers.py +31 -13
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/results.py +1 -1
- pyparsing-3.2.2/pyparsing/tools/cvt_pyparsing_pep8_names.py +116 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/util.py +50 -10
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyproject.toml +1 -0
- pyparsing-3.2.2/tests/__init__.py +0 -0
- pyparsing-3.2.2/tests/test_pep8_converter.py +631 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_unit.py +200 -68
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_util.py +48 -1
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tox.ini +3 -3
- pyparsing-3.2.1/examples/ebnf.py +0 -173
- pyparsing-3.2.1/examples/ebnftest.py +0 -75
- {pyparsing-3.2.1 → pyparsing-3.2.2}/.coveragerc +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/.gitignore +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/.pre-commit-config.yaml +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/BUILDING.md +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/CODE_OF_CONDUCT.rst +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/CONTRIBUTING.md +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/LICENSE +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/CODE_OF_CONDUCT.rst +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/Makefile +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/_static/pyparsingClassDiagram_1.5.2.jpg +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/_static/pyparsingClassDiagram_3.0.9.jpg +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/_static/sql_railroad.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/conf.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/index.rst +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/make_sphinx_docs.bat +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/modules.rst +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/pyparsing.rst +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/pyparsing_class_diagram.puml +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_3_0_0.rst +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_3_1.rst +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/docs/whats_new_in_x_x_template.rst.txt +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/AcManForm.dfm +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/LAparser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/Setup.ini +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/SimpleCalc.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/SingleForm.dfm +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/TAP.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/TAP_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/__init__.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/antlr_grammar.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/antlr_grammar_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/antlr_grammar_tests.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/apicheck.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/apicheck_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/bf.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/bf_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/booleansearchparser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/btpyparse.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/builtin_parse_action_demo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/cLibHeader.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/chemical_formulas.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/chemical_formulas.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/commasep.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/configParse.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/cpp_enum_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/cuneiform_python.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/datetime_parse_actions.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/decaf_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/decaf_parser_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/delta_time.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dfmparse.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dhcpd_leases_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dictExample.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/dictExample2.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/directx_x_file_parser.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/directx_x_file_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/email_address_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/eval_arith.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/excel_expr.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/fourFn.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/gen_ctypes.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/getNTPserversNew.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/greeting.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/greetingInGreek.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/greetingInKorean.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/groupUsingListAllMatches.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/hola_mundo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/html_stripper.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/html_table_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/httpServerLogParser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/idlParse.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/include_preprocessor.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/indentedGrammarExample.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/indented_block_example.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/inv_regex.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/javascript_grammar.g +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/jsonParser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/left_recursion.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lineno_example.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/listAllMatches.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lox_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lox_parser_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lua_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lua_parser_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lucene_grammar.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/lucene_grammar_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/macro_expander.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/make_diagram.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/matchPreviousDemo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mongodb_query_expression.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mongodb_query_expression.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mongodb_query_expression_step_0.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mozilla.ics +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/mozillaCalendarParser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/nested.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/nested_markup.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/numerics.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/oc.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/one_to_ninety_nine.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parseTabularData.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parse_python_value.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parse_python_value.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/parse_results_sum_example.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/partial_gene_match.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/pgn.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/position.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/protobuf_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/pythonGrammarParser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/railroad_diagram_demo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/range_check.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/readJson.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/removeLineBreaks.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/roman_numerals.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/roman_numerals_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/rosettacode.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/rosettacode_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/scanExamples.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/searchParserAppDemo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/searchparser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/select_parser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/sexpParser.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/shapes.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleArith.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleBool.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleSQL.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/simpleWiki.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/snmp_api.h +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/sql2dot.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/stackish.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/documentSignoffDemo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/documentsignoffstate.pystate +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/libraryBookDemo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/librarybookstate.pystate +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/statemachine.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/trafficLightDemo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/trafficlightstate.pystate +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/vending_machine.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/video_demo.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/statemachine/videostate.pystate +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/tag_emitter.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/tag_metadata_diagram.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/test_bibparse.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/unicode_denormalizer.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/urlExtractor.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/urlExtractorNew.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/verilog_parse.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/withAttribute.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/examples/wordsToNum.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/common.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/py.typed +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/testing.py +0 -0
- {pyparsing-3.2.1/tests → pyparsing-3.2.2/pyparsing/tools}/__init__.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/pyparsing/unicode.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/readthedocs.yaml +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/README.md +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/diag_embed.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/diag_no_embed.html +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/json_parser_tests.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/karthik.ini +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/mypy-ignore-cases/forward_methods.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/parsefiletest_input_file.txt +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/requirements.txt +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_diagram.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_examples.py +0 -0
- {pyparsing-3.2.1 → pyparsing-3.2.2}/tests/test_matplotlib_cases.py +0 -0
- {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
|
|
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.
|
|
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.
|
|
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 ``
|
|
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.
|
|
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 ``
|
|
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[...].
|
|
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,
|
|
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,
|
|
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 "
|
|
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
|
-
* [
|
|
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(
|
|
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="
|
|
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="
|
|
29
|
-
<path d="M50.0 31h0.0" /><path d="
|
|
30
|
-
<path d="M70.0
|
|
31
|
-
<path d="M70.0
|
|
32
|
-
<path d="M70.0
|
|
33
|
-
<path d="M169.5
|
|
34
|
-
<path d="
|
|
35
|
-
<path d="
|
|
36
|
-
<path d="M287.5
|
|
37
|
-
<path d="
|
|
38
|
-
<path d="
|
|
39
|
-
<path d="
|
|
40
|
-
<path d="
|
|
41
|
-
<path d="
|
|
42
|
-
<path d="
|
|
43
|
-
<path d="
|
|
44
|
-
<path d="
|
|
45
|
-
<path d="
|
|
46
|
-
<path d="
|
|
47
|
-
<path d="
|
|
48
|
-
<path d="
|
|
49
|
-
<path d="M70.0
|
|
50
|
-
<path d="
|
|
51
|
-
<path d="
|
|
52
|
-
<path d="
|
|
53
|
-
<path d="
|
|
54
|
-
<path d="
|
|
55
|
-
<path d="
|
|
56
|
-
<path d="
|
|
57
|
-
<path d="
|
|
58
|
-
<path d="
|
|
59
|
-
<path d="
|
|
60
|
-
<path d="
|
|
61
|
-
<path d="
|
|
62
|
-
<path d="
|
|
63
|
-
<path d="
|
|
64
|
-
<path d="
|
|
65
|
-
<path d="
|
|
66
|
-
<path d="
|
|
67
|
-
<path d="
|
|
68
|
-
<path d="
|
|
69
|
-
<path d="
|
|
70
|
-
<path d="
|
|
71
|
-
<path d="
|
|
72
|
-
<path d="
|
|
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">'usedObj'</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">'targetObj'</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">'item'</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">'item'</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">'item'</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">'PICK'</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">'UP'</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">'item'</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">'direction'</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">'item'</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
|
}
|
|
@@ -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
|
|
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="
|
|
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
|
}
|