cobol-parser 3.3.1__tar.gz → 3.3.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 (234) hide show
  1. {cobol_parser-3.3.1/cobol_parser.egg-info → cobol_parser-3.3.2}/PKG-INFO +1 -1
  2. {cobol_parser-3.3.1 → cobol_parser-3.3.2/cobol_parser.egg-info}/PKG-INFO +1 -1
  3. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobol_parser.egg-info/SOURCES.txt +1 -0
  4. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/__init__.py +1 -1
  5. cobol_parser-3.3.2/cobolparser/analysis/_abend.py +25 -0
  6. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/move_type_checker.py +6 -6
  7. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/models.py +5 -0
  8. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/scanner.py +13 -2
  9. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/recursion_risk.py +1 -0
  10. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/xref.py +5 -0
  11. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/lexer.py +78 -6
  12. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/tools.py +5 -1
  13. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/pyproject.toml +1 -1
  14. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/LICENSE +0 -0
  15. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/MANIFEST.in +0 -0
  16. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/README.md +0 -0
  17. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobol_parser.egg-info/dependency_links.txt +0 -0
  18. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobol_parser.egg-info/entry_points.txt +0 -0
  19. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobol_parser.egg-info/requires.txt +0 -0
  20. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobol_parser.egg-info/top_level.txt +0 -0
  21. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/__main__.py +0 -0
  22. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_accel.py +0 -0
  23. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_data_fast.c +0 -0
  24. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_data_fast.pyx +0 -0
  25. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_errors.py +0 -0
  26. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_facts_cache.py +0 -0
  27. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_lexer_fast.c +0 -0
  28. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_lexer_fast.pyx +0 -0
  29. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_lines.py +0 -0
  30. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_literals.py +0 -0
  31. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_preprocess_fast.c +0 -0
  32. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_preprocess_fast.pyx +0 -0
  33. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_source_directive.py +0 -0
  34. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/_storage.py +0 -0
  35. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/__init__.py +0 -0
  36. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/_cics.py +0 -0
  37. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/_files.py +0 -0
  38. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/_names.py +0 -0
  39. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/_procedures.py +0 -0
  40. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/_sql_flow.py +0 -0
  41. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/_sql_whenever.py +0 -0
  42. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/ast_diff.py +0 -0
  43. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/boundary_inventory.py +0 -0
  44. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/business_rules.py +0 -0
  45. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/call_interface.py +0 -0
  46. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/codebase.py +0 -0
  47. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/complexity.py +0 -0
  48. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/const_fold.py +0 -0
  49. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/constraints.py +0 -0
  50. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/crud_matrix.py +0 -0
  51. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/dclgen_check.py +0 -0
  52. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/dead_code.py +0 -0
  53. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/domains.py +0 -0
  54. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/field_lineage.py +0 -0
  55. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/field_widening.py +0 -0
  56. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/host_var_resolver.py +0 -0
  57. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/ims_segment_analyzer.py +0 -0
  58. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/invocation_counts.py +0 -0
  59. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/io_coverage_reporter.py +0 -0
  60. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/io_diagnostics.py +0 -0
  61. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/io_logger.py +0 -0
  62. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/io_sequence.py +0 -0
  63. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/language_env_analyzer.py +0 -0
  64. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/lineage_graph.py +0 -0
  65. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/lineage_jcl.py +0 -0
  66. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/linkage_checker.py +0 -0
  67. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/lint.py +0 -0
  68. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/__init__.py +0 -0
  69. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/analyzer.py +0 -0
  70. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/condition_text.py +0 -0
  71. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/cycles.py +0 -0
  72. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/edges.py +0 -0
  73. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/graph.py +0 -0
  74. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_flow/statement_text.py +0 -0
  75. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/program_signature.py +0 -0
  76. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/redundancy.py +0 -0
  77. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/sarif.py +0 -0
  78. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/sql_cics_lint.py +0 -0
  79. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/technical_debt.py +0 -0
  80. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/unused_variables.py +0 -0
  81. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/analysis/value_tracker.py +0 -0
  82. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/batch.py +0 -0
  83. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/cli/__init__.py +0 -0
  84. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/cli/_project_config.py +0 -0
  85. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/cli/coverage.py +0 -0
  86. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/cli/parse.py +0 -0
  87. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/config/__init__.py +0 -0
  88. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/config/_yaml.py +0 -0
  89. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/config/project.py +0 -0
  90. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/core/__init__.py +0 -0
  91. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/core/ast_factory.py +0 -0
  92. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/core/exceptions.py +0 -0
  93. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/core/interfaces.py +0 -0
  94. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/core/registry.py +0 -0
  95. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/core/token_stream.py +0 -0
  96. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/definitions/__init__.py +0 -0
  97. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/definitions/_asm.py +0 -0
  98. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/definitions/bms.py +0 -0
  99. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/definitions/csd.py +0 -0
  100. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/definitions/ddl.py +0 -0
  101. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/definitions/ims.py +0 -0
  102. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/dialects/__init__.py +0 -0
  103. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/dialects/ibm_enterprise.py +0 -0
  104. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/dialects/le_signatures.py +0 -0
  105. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/__init__.py +0 -0
  106. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/copybook_data.py +0 -0
  107. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/__init__.py +0 -0
  108. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/bundle.py +0 -0
  109. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/compare.py +0 -0
  110. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/copybook.py +0 -0
  111. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/dataset.py +0 -0
  112. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/decoding.py +0 -0
  113. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/editing.py +0 -0
  114. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/encoding.py +0 -0
  115. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/errors.py +0 -0
  116. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/layout.py +0 -0
  117. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/layout_offsets.py +0 -0
  118. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/options.py +0 -0
  119. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/program_layout.py +0 -0
  120. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/storage.py +0 -0
  121. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/values.py +0 -0
  122. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/data/views.py +0 -0
  123. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/flowchart.py +0 -0
  124. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/program_fixtures.py +0 -0
  125. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/scenarios.py +0 -0
  126. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/generators/verification.py +0 -0
  127. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/jcl/__init__.py +0 -0
  128. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/jcl/bindings.py +0 -0
  129. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/jcl/models.py +0 -0
  130. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/jcl/parser.py +0 -0
  131. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/jcl/programs.py +0 -0
  132. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/__init__.py +0 -0
  133. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/claims.py +0 -0
  134. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/codebase_index.py +0 -0
  135. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/envelope.py +0 -0
  136. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/facts.py +0 -0
  137. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/hints.py +0 -0
  138. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/jcl_tools.py +0 -0
  139. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/languages.py +0 -0
  140. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/link_decks.py +0 -0
  141. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/navigation.py +0 -0
  142. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/prompts.py +0 -0
  143. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/server.py +0 -0
  144. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/slicing.py +0 -0
  145. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/sort_layout.py +0 -0
  146. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/mcp/workspace.py +0 -0
  147. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/__init__.py +0 -0
  148. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/ast_base.py +0 -0
  149. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/data_items.py +0 -0
  150. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/program.py +0 -0
  151. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/sql_statements.py +0 -0
  152. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/__init__.py +0 -0
  153. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/arithmetic.py +0 -0
  154. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/base.py +0 -0
  155. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/call.py +0 -0
  156. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/communication.py +0 -0
  157. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/control.py +0 -0
  158. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/data.py +0 -0
  159. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/io.py +0 -0
  160. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/legacy.py +0 -0
  161. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/misc.py +0 -0
  162. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/models/statements/report_writer.py +0 -0
  163. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parser.py +0 -0
  164. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/__init__.py +0 -0
  165. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/__init__.py +0 -0
  166. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/base.py +0 -0
  167. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/data.py +0 -0
  168. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/data_clauses.py +0 -0
  169. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/data_file_description.py +0 -0
  170. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/data_report_description.py +0 -0
  171. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/data_special_entries.py +0 -0
  172. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/environment.py +0 -0
  173. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/environment_sections.py +0 -0
  174. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/environment_select.py +0 -0
  175. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/factory.py +0 -0
  176. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/identification.py +0 -0
  177. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/procedure.py +0 -0
  178. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/procedure_boundaries.py +0 -0
  179. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/procedure_recovery.py +0 -0
  180. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/divisions/procedure_registry.py +0 -0
  181. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/__init__.py +0 -0
  182. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/_conditions.py +0 -0
  183. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/_utils.py +0 -0
  184. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/accept_parser.py +0 -0
  185. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/allocate_free_parsers.py +0 -0
  186. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/arithmetic_parsers.py +0 -0
  187. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/call_parser.py +0 -0
  188. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/close_parser.py +0 -0
  189. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/communication_parsers.py +0 -0
  190. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/delete_parser.py +0 -0
  191. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/display_parser.py +0 -0
  192. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/entry_parser.py +0 -0
  193. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/evaluate_parser.py +0 -0
  194. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/exception_parsers.py +0 -0
  195. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/go_parser.py +0 -0
  196. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/ibm_exec_statements.py +0 -0
  197. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/if_parser.py +0 -0
  198. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/initialize_inspect_parsers.py +0 -0
  199. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/invoke_parser.py +0 -0
  200. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/legacy_verb_parsers.py +0 -0
  201. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/move_parser.py +0 -0
  202. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/open_parser.py +0 -0
  203. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/perform_parser.py +0 -0
  204. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/read_parser.py +0 -0
  205. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/report_writer_parsers.py +0 -0
  206. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/rewrite_parser.py +0 -0
  207. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/search_parser.py +0 -0
  208. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/set_parser.py +0 -0
  209. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/simple_statement_parsers.py +0 -0
  210. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/sort_merge_parsers.py +0 -0
  211. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/start_parser.py +0 -0
  212. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/stop_parser.py +0 -0
  213. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/string_unstring_parsers.py +0 -0
  214. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/unlock_parser.py +0 -0
  215. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/write_parser.py +0 -0
  216. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/parsers/statements/xml_json_parser.py +0 -0
  217. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/plugins/__init__.py +0 -0
  218. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/plugins/core.py +0 -0
  219. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/__init__.py +0 -0
  220. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/_normalize.py +0 -0
  221. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/copy_statement_parser.py +0 -0
  222. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/copybook_expander.py +0 -0
  223. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/models.py +0 -0
  224. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/path_resolver.py +0 -0
  225. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/replace_statement.py +0 -0
  226. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/preprocess/source_format.py +0 -0
  227. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/profiling.py +0 -0
  228. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/py.typed +0 -0
  229. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/cobolparser/scan.py +0 -0
  230. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/setup.cfg +0 -0
  231. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/setup.py +0 -0
  232. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/tests/test_all_samples.py +0 -0
  233. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/tests/test_okf_claims.py +0 -0
  234. {cobol_parser-3.3.1 → cobol_parser-3.3.2}/tests/test_okf_staleness_map.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cobol-parser
3
- Version: 3.3.1
3
+ Version: 3.3.2
4
4
  Summary: A comprehensive COBOL parser for Python with IBM Enterprise COBOL focus
5
5
  Author-email: Samuel Dion <sam94dion@gmail.com>
6
6
  License: AGPL-3.0-or-later
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cobol-parser
3
- Version: 3.3.1
3
+ Version: 3.3.2
4
4
  Summary: A comprehensive COBOL parser for Python with IBM Enterprise COBOL focus
5
5
  Author-email: Samuel Dion <sam94dion@gmail.com>
6
6
  License: AGPL-3.0-or-later
@@ -31,6 +31,7 @@ cobolparser/profiling.py
31
31
  cobolparser/py.typed
32
32
  cobolparser/scan.py
33
33
  cobolparser/analysis/__init__.py
34
+ cobolparser/analysis/_abend.py
34
35
  cobolparser/analysis/_cics.py
35
36
  cobolparser/analysis/_files.py
36
37
  cobolparser/analysis/_names.py
@@ -231,7 +231,7 @@ from .scan import (
231
231
  CobolParseError = ParseError
232
232
 
233
233
  # Version info
234
- __version__ = "3.3.1" # x-release-please-version
234
+ __version__ = "3.3.2" # x-release-please-version
235
235
  __author__ = "Samuel Dion"
236
236
  __license__ = "AGPL-3.0-or-later"
237
237
 
@@ -0,0 +1,25 @@
1
+ """Static CALLs of abend services that never return to the caller."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from ..models.statements.call import CallStatement
8
+
9
+ #: IBM abend services that end the run unit and never return: Language
10
+ #: Environment's CEE3ABD ("CEE3ABD does not return", ``le_signatures``) and
11
+ #: the COBOL library's ILBOABN0. Site-specific abend modules (``ABEND``,
12
+ #: ``CKRABEND``) are left out: whether they return is not known here.
13
+ NON_RETURNING_ABEND_PROGRAMS = frozenset({"CEE3ABD", "ILBOABN0"})
14
+
15
+
16
+ def abend_call_target(stmt: Any) -> str | None:
17
+ """The abend service *stmt* CALLs statically, or None.
18
+
19
+ Only a literal ``CALL 'CEE3ABD'`` counts: a dynamic CALL through a data
20
+ name may name any program at run time.
21
+ """
22
+ if not isinstance(stmt, CallStatement) or stmt.is_dynamic:
23
+ return None
24
+ target = (stmt.called_program or "").strip().strip("'\"").upper()
25
+ return target if target in NON_RETURNING_ABEND_PROGRAMS else None
@@ -510,14 +510,14 @@ def _classify_picture(pic: PictureClause) -> DataCategory:
510
510
 
511
511
  if has_edit_chars:
512
512
  # Test symbols on pattern_no_reps: the 9 in a repeat count such as
513
- # X(9)BX(9) is not a digit position.
514
- # Numeric-edited: contains 9s alongside editing characters
515
- if "9" in pattern_no_reps:
516
- return DataCategory.NUMERIC_EDITED
517
- # Alphanumeric-edited: X with editing chars
513
+ # X(9)BX(9) is not a digit position. An edited picture holding an
514
+ # X or an A is alphanumeric-edited even when it also holds 9s
515
+ # (PIC XXB99, 99/XX, A9B9): only numeric editing symbols with 9s
516
+ # make an item numeric-edited (IBM Language Reference, "PICTURE
517
+ # clause editing").
518
518
  if "X" in pattern_no_reps or "A" in pattern_no_reps:
519
519
  return DataCategory.ALPHANUMERIC_EDITED
520
- return DataCategory.NUMERIC_EDITED # default for edited
520
+ return DataCategory.NUMERIC_EDITED
521
521
 
522
522
  # Pure numeric: only S, 9, V, P and grouping digits
523
523
  if _PIC_NUMERIC_ONLY_RE.match(pattern):
@@ -77,6 +77,9 @@ class FlowNode:
77
77
  #: EXEC CICS RETURN / XCTL / ABEND: leaves the program, at least when
78
78
  #: it succeeds (one with RESP / NOHANDLE may also fall through).
79
79
  has_cics_exit: bool = False
80
+ #: A static CALL of a Language Environment abend service that never
81
+ #: returns (``CALL 'CEE3ABD'``, ``CALL 'ILBOABN0'``): ends the program.
82
+ has_abend_call: bool = False
80
83
  #: A SORT/MERGE ``RETURN sd-file`` (reads the next sorted record) --
81
84
  #: not a program terminator, unlike the four flags above.
82
85
  has_return: bool = False
@@ -124,6 +127,8 @@ class FlowNode:
124
127
  result["has_exit_program"] = True
125
128
  if self.has_cics_exit:
126
129
  result["has_cics_exit"] = True
130
+ if self.has_abend_call:
131
+ result["has_abend_call"] = True
127
132
  if self.has_return:
128
133
  result["has_return"] = True
129
134
  if self.has_exit_section:
@@ -32,6 +32,7 @@ from ...models.statements.misc import (
32
32
  SortStatement,
33
33
  XmlJsonStatement,
34
34
  )
35
+ from .._abend import abend_call_target
35
36
  from .._cics import cics_exit_kind, cics_terminator_kind
36
37
  from .._procedures import ProcedureIndex, branch_terminates, enclosing_section
37
38
  from .condition_text import render_condition_text
@@ -337,6 +338,13 @@ class ProcedureScanner:
337
338
  elif isinstance(stmt, CallStatement):
338
339
  node.call_count += 1
339
340
  self._collector.process_call(stmt, proc_name)
341
+ abend_target = abend_call_target(stmt)
342
+ if abend_target is not None:
343
+ node.has_abend_call = True
344
+ self._exit_points.add(proc_name)
345
+ self._record_exit_statement(
346
+ node, f"CALL '{abend_target}'", stmt.location
347
+ )
340
348
  # Queue exception handler branches for nested flow
341
349
  push_sequential(
342
350
  [
@@ -678,8 +686,9 @@ class ProcedureScanner:
678
686
  reached: STOP RUN (not STOP 'literal', which merely halts pending
679
687
  operator action), GOBACK, EXIT PROGRAM, a non-DEPENDING GO TO --
680
688
  including the alterable ``GO TO.`` with no operand, which always
681
- transfers to whatever an ALTER last set it to -- or EXEC CICS
682
- RETURN / XCTL / ABEND (see ``_cics``). Mirrors
689
+ transfers to whatever an ALTER last set it to -- EXEC CICS
690
+ RETURN / XCTL / ABEND (see ``_cics``), or a static CALL of a
691
+ non-returning abend service (``abend_call_target``, #817). Mirrors
683
692
  DeadCodeAnalyzer._is_terminator, kept independent per this package's
684
693
  existing collaborator architecture. An exhaustive IF/EVALUATE whose
685
694
  every arm terminates counts too (``_procedures.branch_terminates``).
@@ -690,6 +699,8 @@ class ProcedureScanner:
690
699
  return True
691
700
  if isinstance(stmt, GobackStatement):
692
701
  return True
702
+ if abend_call_target(stmt) is not None:
703
+ return True
693
704
  if isinstance(stmt, StopStatement):
694
705
  return stmt.stop_type == "RUN"
695
706
  if isinstance(stmt, ExitStatement):
@@ -227,6 +227,7 @@ class _FlowIndex:
227
227
  or node.has_goback
228
228
  or node.has_exit_program
229
229
  or node.has_cics_exit
230
+ or node.has_abend_call
230
231
  ):
231
232
  return True
232
233
  if not self.escape_targets.get(name, set()) <= component:
@@ -34,6 +34,7 @@ import re
34
34
  from dataclasses import dataclass, field
35
35
  from typing import Any
36
36
 
37
+ from .._literals import QUOTED_LITERAL_RE
37
38
  from ..dialects.ibm_enterprise import IBMEnterpriseCobol
38
39
  from ..lexer import CobolLexer
39
40
  from ..models.ast_base import ASTNode, SourceLocation
@@ -500,6 +501,10 @@ def _split_operand(text: str) -> tuple[set[str], set[str], set[str], bool]:
500
501
  """
501
502
  if not text:
502
503
  return set(), set(), set(), True
504
+ # A literal's text is no operand: `MOVE "TEST(S) FAILED" TO X` read S as a
505
+ # subscript (NIST CCVS85, every program), since the parentheses were
506
+ # split off before the literal was dropped.
507
+ text = QUOTED_LITERAL_RE.sub(" ", text)
503
508
  # DFHRESP(cond) / DFHVALUE(cvda): the argument is no subscript (#594).
504
509
  text = strip_translator_arguments(text)
505
510
 
@@ -2731,15 +2731,70 @@ class _CobolLexerPure:
2731
2731
  ):
2732
2732
  end += 1
2733
2733
  if end - index > 1 and not self._after_picture(merged):
2734
- text = "".join(t.value or "" for t in tokens[index:end])
2735
- if self._TEMPLATE_NAME_RE.fullmatch(text):
2736
- merged.append(Token(TokenType.IDENTIFIER, text, token.location))
2734
+ span = self._template_name_span(tokens, index, end)
2735
+ if span is not None:
2736
+ start, stop = span
2737
+ text = "".join(t.value or "" for t in tokens[start:stop])
2738
+ merged.extend(tokens[index:start])
2739
+ merged.append(
2740
+ Token(TokenType.IDENTIFIER, text, tokens[start].location)
2741
+ )
2742
+ merged.extend(tokens[stop:end])
2737
2743
  index = end
2738
2744
  continue
2739
2745
  merged.extend(tokens[index:end])
2740
2746
  index = end
2741
2747
  tokens[:] = merged
2742
2748
 
2749
+ def _template_name_span(
2750
+ self, tokens: list[Token], index: int, end: int
2751
+ ) -> tuple[int, int] | None:
2752
+ """The ``[start, stop)`` slice of the run ``tokens[index:end]`` that
2753
+ spells a placeholder name, or None.
2754
+
2755
+ The run may carry a condition's own parentheses abutting the name:
2756
+ ``IF (FLG-(TESTVAR1)-NOT-OK`` / ``OR FLG-(TESTVAR1)-BLANK)``. Those
2757
+ leading '(' and trailing ')' tokens are peeled off, fewest first,
2758
+ so a placeholder that ends the name (``WS-(SFX)``) keeps its ')'.
2759
+ A reserved word the '(' abuts (``NOT(``, ``AND(``, ``UNTIL(``, #814)
2760
+ is peeled off first: it is never part of the name.
2761
+ """
2762
+ if (
2763
+ end - index > 2
2764
+ and tokens[index + 1].type == TokenType.LEFT_PAREN
2765
+ and self._is_reserved_word(tokens[index])
2766
+ ):
2767
+ index += 1
2768
+ leading = 0
2769
+ while index + leading < end and tokens[index + leading].type == (
2770
+ TokenType.LEFT_PAREN
2771
+ ):
2772
+ leading += 1
2773
+ trailing = 0
2774
+ while end - trailing > index and tokens[end - trailing - 1].type == (
2775
+ TokenType.RIGHT_PAREN
2776
+ ):
2777
+ trailing += 1
2778
+ for peel_left in range(leading + 1):
2779
+ for peel_right in range(trailing + 1):
2780
+ start, stop = index + peel_left, end - peel_right
2781
+ if stop - start < 2:
2782
+ continue
2783
+ text = "".join(t.value or "" for t in tokens[start:stop])
2784
+ if self._TEMPLATE_NAME_RE.fullmatch(text):
2785
+ return start, stop
2786
+ return None
2787
+
2788
+ @staticmethod
2789
+ def _is_reserved_word(token: Token) -> bool:
2790
+ """Whether *token* is a COBOL reserved word (a keyword token)."""
2791
+ value = token.value or ""
2792
+ return (
2793
+ token.type != TokenType.IDENTIFIER
2794
+ and value.isalpha()
2795
+ and token.type.name == value.upper().replace("-", "_")
2796
+ )
2797
+
2743
2798
  @staticmethod
2744
2799
  def _after_picture(merged: list[Token]) -> bool:
2745
2800
  """Whether the next token is a PICTURE string (``PIC [IS] ...``)."""
@@ -2781,8 +2836,9 @@ class _CobolLexerPure:
2781
2836
  A '#' or '@' that abuts a word (``WS-#CPT``, ``@ADDR``) is a letter
2782
2837
  of that name in some shops' dialects; it is glued into one
2783
2838
  IDENTIFIER rather than dropped, so every reference to the name stays
2784
- the same name. A declared PICTURE currency symbol (``CURRENCY SIGN
2785
- IS 'EUR' WITH PICTURE SYMBOL '#'``) becomes CURRENCY.
2839
+ the same name, whether or not that character is also a declared
2840
+ PICTURE currency symbol. Otherwise a declared currency symbol
2841
+ (``CURRENCY SIGN IS 'EUR' WITH PICTURE SYMBOL '#'``) becomes CURRENCY.
2786
2842
 
2787
2843
  A single linear pass, shared verbatim by the Cython fast path, which
2788
2844
  inherits this method.
@@ -2796,9 +2852,17 @@ class _CobolLexerPure:
2796
2852
  in_exec = False
2797
2853
  # Whether kept[-1] is a name already glued around a '#' / '@'.
2798
2854
  glued = False
2855
+ # Whether *token* belongs to a PICTURE string: the run of abutting
2856
+ # tokens right after PIC / PICTURE [IS]. Only there is a declared
2857
+ # currency symbol one (#809).
2858
+ in_picture = False
2799
2859
  count = len(tokens)
2800
2860
  for index, token in enumerate(tokens):
2801
2861
  ttype = token.type
2862
+ if in_picture and not self._abuts(tokens[index - 1], token):
2863
+ in_picture = False
2864
+ if not in_picture and self._after_picture(kept):
2865
+ in_picture = True
2802
2866
  if ttype == TokenType.EXEC:
2803
2867
  in_exec = True
2804
2868
  elif ttype == TokenType.END_EXEC:
@@ -2821,11 +2885,14 @@ class _CobolLexerPure:
2821
2885
  continue
2822
2886
  line = token.location.line if token.location else 0
2823
2887
  if ttype == TokenType.SQL_NAME_CHAR:
2824
- if token.value in self._currency_symbols:
2888
+ if in_picture and token.value in self._currency_symbols:
2825
2889
  token.type = TokenType.CURRENCY
2826
2890
  kept.append(token)
2827
2891
  glued = False
2828
2892
  continue
2893
+ # Outside a PICTURE string a currency symbol means nothing,
2894
+ # so ``WS-#N`` stays one name even when '#' is the PICTURE
2895
+ # currency symbol (#809).
2829
2896
  prev = kept[-1] if kept else None
2830
2897
  nxt = tokens[index + 1] if index + 1 < count else None
2831
2898
  if (
@@ -2851,6 +2918,11 @@ class _CobolLexerPure:
2851
2918
  glued = True
2852
2919
  glued_names.setdefault(token.value, []).append(line)
2853
2920
  continue
2921
+ if token.value in self._currency_symbols:
2922
+ token.type = TokenType.CURRENCY
2923
+ kept.append(token)
2924
+ glued = False
2925
+ continue
2854
2926
  dropped.setdefault(token.value, []).append(line)
2855
2927
  glued = False
2856
2928
  tokens[:] = kept
@@ -3285,7 +3285,11 @@ def _control_flow_notes(nodes: list[Any]) -> list[str]:
3285
3285
  ends = [
3286
3286
  n
3287
3287
  for n in nodes
3288
- if n.has_stop_run or n.has_goback or n.has_exit_program or n.has_cics_exit
3288
+ if n.has_stop_run
3289
+ or n.has_goback
3290
+ or n.has_exit_program
3291
+ or n.has_cics_exit
3292
+ or n.has_abend_call
3289
3293
  ]
3290
3294
  if not ends:
3291
3295
  notes.append(
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cobol-parser"
7
- version = "3.3.1"
7
+ version = "3.3.2"
8
8
  description = "A comprehensive COBOL parser for Python with IBM Enterprise COBOL focus"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes