Skip to content

#727 Fix parsing of '88 VALUE1 VALUE +999.9999.' statement that threw 'SytnaxErrorException'. - #866

Merged
yruslan merged 1 commit into
masterfrom
bugfix/727-parse-999-9999-values
Jul 31, 2026
Merged

#727 Fix parsing of '88 VALUE1 VALUE +999.9999.' statement that threw 'SytnaxErrorException'.#866
yruslan merged 1 commit into
masterfrom
bugfix/727-parse-999-9999-values

Conversation

@yruslan

@yruslan yruslan commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Closes #727

Summary by CodeRabbit

  • New Features

    • Added support for optionally signed numeric literals with explicit decimal notation in COBOL copybooks.
    • Improved parsing of precision-9 decimal values in PIC clauses.
  • Bug Fixes

    • Valid explicit-decimal PIC definitions, including condition-name entries, are now parsed correctly.

@github-actions

Copy link
Copy Markdown

JaCoCo code coverage report - 'cobol-parser'

Overall Project 90.07% -0.67% 🍏
Files changed 57.21% 🍏

File Coverage
copybookParser.java 51.99% -4.84% 🍏

@github-actions

Copy link
Copy Markdown

JaCoCo code coverage report - 'spark-cobol'

Overall Project 83.52% 🍏

There is no coverage information present for the Files changed

@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The ANTLR grammar now accepts optionally signed PRECISION_9_EXPLICIT_DOT literals. The generated parser was regenerated, and syntax coverage was added for explicit decimal PIC and condition-name values.

Changes

Explicit decimal parsing

Layer / File(s) Summary
Numeric literal grammar contract
cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/antlr/copybookParser.g4
The numericLiteral rule accepts an optional sign before PRECISION_9_EXPLICIT_DOT.
Generated parser and syntax coverage
cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/antlr/copybookParser.java, cobol-parser/src/test/scala/za/co/absa/cobrix/cobol/parser/parse/SyntaxErrorsSpec.scala
The generated parser includes the new numeric literal branch and regenerated state data. Tests cover +999.9999 and explicit decimal condition-name values.

Estimated code review effort: 2 (Simple) | ~10 minutes

Poem

I’m a rabbit parsing dots,
Signed nines in proper slots.
PIC fields now pass the gate,
Condition values parse straight.
Hop, hop—syntax fixed!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the parsing fix and references the failing COBOL statement from issue #727.
Linked Issues check ✅ Passed The grammar now accepts signed explicit-decimal literals, and tests cover +999.9999 and +951.22 required by issue [#727].
Out of Scope Changes check ✅ Passed The changes are limited to the parser grammar, regenerated parser, and targeted syntax tests for the linked issue.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch bugfix/727-parse-999-9999-values

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/antlr/copybookParser.java`:
- Around line 3866-4067: Configure the ANTLR4 Maven generation task in pom.xml,
adding the ANTLR plugin and grammar source setup so copybookParser.g4 generates
copybookParser.java during the build before compilation. Keep the generated
parser synchronized with the grammar and retain antlr4-runtime for runtime
usage.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b25ae6e1-aa7a-45ba-b16c-7c866a52326b

📥 Commits

Reviewing files that changed from the base of the PR and between b017ff9 and 7bf354f.

📒 Files selected for processing (3)
  • cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/antlr/copybookParser.g4
  • cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/antlr/copybookParser.java
  • cobol-parser/src/test/scala/za/co/absa/cobrix/cobol/parser/parse/SyntaxErrorsSpec.scala

Comment on lines 3866 to +4067
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u008a\u01d7\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u008a\u01db\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\3\2\6\2"+
"V\n\2\r\2\16\2W\3\2\5\2[\n\2\3\2\3\2\3\3\3\3\3\3\3\3\5\3c\n\3\3\4\5\4"+
"f\n\4\3\4\3\4\3\4\5\4k\n\4\3\4\5\4n\n\4\3\5\3\5\3\6\3\6\3\7\3\7\3\7\3"+
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
"f\n\4\3\4\3\4\3\4\5\4k\n\4\3\4\3\4\5\4o\n\4\3\4\5\4r\n\4\3\5\3\5\3\6\3"+
"\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3"+
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3"+
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\5\7\u00c6\n\7\3\b\3\b\3\t\3\t\5\t\u00cc"+
"\n\t\3\t\3\t\5\t\u00d0\n\t\5\t\u00d2\n\t\3\t\3\t\5\t\u00d6\n\t\3\t\7\t"+
"\u00d9\n\t\f\t\16\t\u00dc\13\t\3\n\3\n\5\n\u00e0\n\n\3\13\3\13\3\f\3\f"+
"\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u00f6"+
"\n\r\3\16\3\16\5\16\u00fa\n\16\3\16\5\16\u00fd\n\16\3\16\3\16\3\17\3\17"+
"\3\17\3\20\3\20\5\20\u0106\n\20\3\20\3\20\3\21\3\21\5\21\u010c\n\21\3"+
"\21\3\21\5\21\u0110\n\21\3\21\7\21\u0113\n\21\f\21\16\21\u0116\13\21\3"+
"\22\3\22\3\22\5\22\u011b\n\22\3\22\5\22\u011e\n\22\3\22\5\22\u0121\n\22"+
"\3\22\5\22\u0124\n\22\3\22\5\22\u0127\n\22\3\23\3\23\3\23\3\24\3\24\3"+
"\24\3\24\3\24\5\24\u0131\n\24\3\25\3\25\3\26\3\26\3\27\3\27\5\27\u0139"+
"\n\27\5\27\u013b\n\27\3\27\3\27\3\30\3\30\5\30\u0141\n\30\5\30\u0143\n"+
"\30\3\30\3\30\3\31\3\31\5\31\u0149\n\31\3\31\3\31\5\31\u014d\n\31\3\31"+
"\5\31\u0150\n\31\3\32\3\32\5\32\u0154\n\32\3\33\3\33\3\34\3\34\5\34\u015a"+
"\n\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
"\5\35\u0169\n\35\3\36\5\36\u016c\n\36\3\36\3\36\3\36\3\36\5\36\u0172\n"+
"\36\3\37\3\37\3 \3 \3!\3!\3\"\3\"\3#\3#\3#\3#\3#\3#\5#\u0182\n#\3#\5#"+
"\u0185\n#\3#\5#\u0188\n#\5#\u018a\n#\3#\3#\5#\u018e\n#\5#\u0190\n#\3#"+
"\3#\3#\5#\u0195\n#\5#\u0197\n#\3#\5#\u019a\n#\3$\3$\3%\3%\3&\3&\3&\3&"+
"\3&\3&\7&\u01a6\n&\f&\16&\u01a9\13&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'"+
"\3\'\3\'\7\'\u01b6\n\'\f\'\16\'\u01b9\13\'\3\'\3\'\5\'\u01bd\n\'\3\'\5"+
"\'\u01c0\n\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3"+
"*\5*\u01d5\n*\3*\2\2+\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,."+
"\60\62\64\668:<>@BDFHJLNPR\2\17\4\2^^\177\u0084\4\2##JJ\4\2\6\6 \6\2"+
"\7\7\f\35!!\66\66\b\2\7\7\f\r\20\26\31\35!!\66\66\4\2,,II\3\2)*\4\2aa"+
"xx\4\2bbzz\4\2__tt\3\2\678\3\2\177\u0080\3\2?A\2\u025c\2U\3\2\2\2\4b\3"+
"\2\2\2\6m\3\2\2\2\bo\3\2\2\2\nq\3\2\2\2\f\u00c5\3\2\2\2\16\u00c7\3\2\2"+
"\2\20\u00d1\3\2\2\2\22\u00dd\3\2\2\2\24\u00e1\3\2\2\2\26\u00e3\3\2\2\2"+
"\30\u00f5\3\2\2\2\32\u00f7\3\2\2\2\34\u0100\3\2\2\2\36\u0103\3\2\2\2 "+
"\u0109\3\2\2\2\"\u0117\3\2\2\2$\u0128\3\2\2\2&\u012b\3\2\2\2(\u0132\3"+
"\2\2\2*\u0134\3\2\2\2,\u013a\3\2\2\2.\u0142\3\2\2\2\60\u0146\3\2\2\2\62"+
"\u0151\3\2\2\2\64\u0155\3\2\2\2\66\u0159\3\2\2\28\u0168\3\2\2\2:\u0171"+
"\3\2\2\2<\u0173\3\2\2\2>\u0175\3\2\2\2@\u0177\3\2\2\2B\u0179\3\2\2\2D"+
"\u0199\3\2\2\2F\u019b\3\2\2\2H\u019d\3\2\2\2J\u019f\3\2\2\2L\u01ac\3\2"+
"\2\2N\u01c3\3\2\2\2P\u01c8\3\2\2\2R\u01d4\3\2\2\2TV\5R*\2UT\3\2\2\2VW"+
"\3\2\2\2WU\3\2\2\2WX\3\2\2\2XZ\3\2\2\2Y[\7\u0089\2\2ZY\3\2\2\2Z[\3\2\2"+
"\2[\\\3\2\2\2\\]\7\2\2\3]\3\3\2\2\2^c\7~\2\2_c\5\6\4\2`c\5\n\6\2ac\5\30"+
"\r\2b^\3\2\2\2b_\3\2\2\2b`\3\2\2\2ba\3\2\2\2c\5\3\2\2\2df\5\66\34\2ed"+
"\3\2\2\2ef\3\2\2\2fg\3\2\2\2gn\7\u0086\2\2hn\7P\2\2ik\5\66\34\2ji\3\2"+
"\2\2jk\3\2\2\2kl\3\2\2\2ln\5\b\5\2me\3\2\2\2mh\3\2\2\2mj\3\2\2\2n\7\3"+
"\2\2\2op\t\2\2\2p\t\3\2\2\2qr\t\3\2\2r\13\3\2\2\2s\u00c6\7\u0088\2\2t"+
"\u00c6\7\3\2\2u\u00c6\7_\2\2v\u00c6\7`\2\2w\u00c6\7f\2\2x\u00c6\7a\2\2"+
"y\u00c6\3\2\2\2z\u00c6\7b\2\2{\u00c6\7c\2\2|\u00c6\7g\2\2}\u00c6\7d\2"+
"\2~\u00c6\7h\2\2\177\u00c6\7e\2\2\u0080\u00c6\7i\2\2\u0081\u00c6\7\u0087"+
"\2\2\u0082\u00c6\7B\2\2\u0083\u00c6\7,\2\2\u0084\u00c6\7I\2\2\u0085\u00c6"+
"\7>\2\2\u0086\u00c6\7\n\2\2\u0087\u00c6\7\6\2\2\u0088\u00c6\7 \2\2\u0089"+
"\u00c6\7+\2\2\u008a\u00c6\7\7\2\2\u008b\u00c6\7!\2\2\u008c\u00c6\7\66"+
"\2\2\u008d\u00c6\7\25\2\2\u008e\u00c6\7\26\2\2\u008f\u00c6\7\27\2\2\u0090"+
"\u00c6\7\30\2\2\u0091\u00c6\7\31\2\2\u0092\u00c6\7\32\2\2\u0093\u00c6"+
"\7\33\2\2\u0094\u00c6\7\34\2\2\u0095\u00c6\7\35\2\2\u0096\u00c6\7\f\2"+
"\2\u0097\u00c6\7\r\2\2\u0098\u00c6\7\16\2\2\u0099\u00c6\7\17\2\2\u009a"+
"\u00c6\7\20\2\2\u009b\u00c6\7\21\2\2\u009c\u00c6\7\22\2\2\u009d\u00c6"+
"\7\23\2\2\u009e\u00c6\7\24\2\2\u009f\u00c6\7;\2\2\u00a0\u00c6\7<\2\2\u00a1"+
"\u00c6\7M\2\2\u00a2\u00c6\7N\2\2\u00a3\u00c6\7\64\2\2\u00a4\u00c6\7G\2"+
"\2\u00a5\u00c6\7\37\2\2\u00a6\u00c6\7\'\2\2\u00a7\u00c6\7\b\2\2\u00a8"+
"\u00c6\7P\2\2\u00a9\u00c6\7Q\2\2\u00aa\u00c6\7R\2\2\u00ab\u00c6\7C\2\2"+
"\u00ac\u00c6\7D\2\2\u00ad\u00c6\7%\2\2\u00ae\u00c6\7&\2\2\u00af\u00c6"+
"\7.\2\2\u00b0\u00c6\7/\2\2\u00b1\u00c6\7\60\2\2\u00b2\u00c6\7\61\2\2\u00b3"+
"\u00c6\79\2\2\u00b4\u00c6\7:\2\2\u00b5\u00c6\7*\2\2\u00b6\u00c6\7)\2\2"+
"\u00b7\u00c6\7=\2\2\u00b8\u00c6\78\2\2\u00b9\u00c6\7\67\2\2\u00ba\u00c6"+
"\7J\2\2\u00bb\u00c6\7#\2\2\u00bc\u00c6\7\5\2\2\u00bd\u00c6\7(\2\2\u00be"+
"\u00c6\7\65\2\2\u00bf\u00c6\7\t\2\2\u00c0\u00c6\7O\2\2\u00c1\u00c6\7H"+
"\2\2\u00c2\u00c6\7\4\2\2\u00c3\u00c6\7K\2\2\u00c4\u00c6\7$\2\2\u00c5s"+
"\3\2\2\2\u00c5t\3\2\2\2\u00c5u\3\2\2\2\u00c5v\3\2\2\2\u00c5w\3\2\2\2\u00c5"+
"x\3\2\2\2\u00c5y\3\2\2\2\u00c5z\3\2\2\2\u00c5{\3\2\2\2\u00c5|\3\2\2\2"+
"\u00c5}\3\2\2\2\u00c5~\3\2\2\2\u00c5\177\3\2\2\2\u00c5\u0080\3\2\2\2\u00c5"+
"\u0081\3\2\2\2\u00c5\u0082\3\2\2\2\u00c5\u0083\3\2\2\2\u00c5\u0084\3\2"+
"\2\2\u00c5\u0085\3\2\2\2\u00c5\u0086\3\2\2\2\u00c5\u0087\3\2\2\2\u00c5"+
"\u0088\3\2\2\2\u00c5\u0089\3\2\2\2\u00c5\u008a\3\2\2\2\u00c5\u008b\3\2"+
"\2\2\u00c5\u008c\3\2\2\2\u00c5\u008d\3\2\2\2\u00c5\u008e\3\2\2\2\u00c5"+
"\u008f\3\2\2\2\u00c5\u0090\3\2\2\2\u00c5\u0091\3\2\2\2\u00c5\u0092\3\2"+
"\2\2\u00c5\u0093\3\2\2\2\u00c5\u0094\3\2\2\2\u00c5\u0095\3\2\2\2\u00c5"+
"\u0096\3\2\2\2\u00c5\u0097\3\2\2\2\u00c5\u0098\3\2\2\2\u00c5\u0099\3\2"+
"\2\2\u00c5\u009a\3\2\2\2\u00c5\u009b\3\2\2\2\u00c5\u009c\3\2\2\2\u00c5"+
"\u009d\3\2\2\2\u00c5\u009e\3\2\2\2\u00c5\u009f\3\2\2\2\u00c5\u00a0\3\2"+
"\2\2\u00c5\u00a1\3\2\2\2\u00c5\u00a2\3\2\2\2\u00c5\u00a3\3\2\2\2\u00c5"+
"\u00a4\3\2\2\2\u00c5\u00a5\3\2\2\2\u00c5\u00a6\3\2\2\2\u00c5\u00a7\3\2"+
"\2\2\u00c5\u00a8\3\2\2\2\u00c5\u00a9\3\2\2\2\u00c5\u00aa\3\2\2\2\u00c5"+
"\u00ab\3\2\2\2\u00c5\u00ac\3\2\2\2\u00c5\u00ad\3\2\2\2\u00c5\u00ae\3\2"+
"\2\2\u00c5\u00af\3\2\2\2\u00c5\u00b0\3\2\2\2\u00c5\u00b1\3\2\2\2\u00c5"+
"\u00b2\3\2\2\2\u00c5\u00b3\3\2\2\2\u00c5\u00b4\3\2\2\2\u00c5\u00b5\3\2"+
"\2\2\u00c5\u00b6\3\2\2\2\u00c5\u00b7\3\2\2\2\u00c5\u00b8\3\2\2\2\u00c5"+
"\u00b9\3\2\2\2\u00c5\u00ba\3\2\2\2\u00c5\u00bb\3\2\2\2\u00c5\u00bc\3\2"+
"\2\2\u00c5\u00bd\3\2\2\2\u00c5\u00be\3\2\2\2\u00c5\u00bf\3\2\2\2\u00c5"+
"\u00c0\3\2\2\2\u00c5\u00c1\3\2\2\2\u00c5\u00c2\3\2\2\2\u00c5\u00c3\3\2"+
"\2\2\u00c5\u00c4\3\2\2\2\u00c6\r\3\2\2\2\u00c7\u00c8\7\3\2\2\u00c8\17"+
"\3\2\2\2\u00c9\u00cb\7M\2\2\u00ca\u00cc\7(\2\2\u00cb\u00ca\3\2\2\2\u00cb"+
"\u00cc\3\2\2\2\u00cc\u00d2\3\2\2\2\u00cd\u00cf\7N\2\2\u00ce\u00d0\7\5"+
"\2\2\u00cf\u00ce\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0\u00d2\3\2\2\2\u00d1"+
"\u00c9\3\2\2\2\u00d1\u00cd\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3\u00da\5\22"+
"\n\2\u00d4\u00d6\7T\2\2\u00d5\u00d4\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6"+
"\u00d7\3\2\2\2\u00d7\u00d9\5\22\n\2\u00d8\u00d5\3\2\2\2\u00d9\u00dc\3"+
"\2\2\2\u00da\u00d8\3\2\2\2\u00da\u00db\3\2\2\2\u00db\21\3\2\2\2\u00dc"+
"\u00da\3\2\2\2\u00dd\u00df\5\24\13\2\u00de\u00e0\5\26\f\2\u00df\u00de"+
"\3\2\2\2\u00df\u00e0\3\2\2\2\u00e0\23\3\2\2\2\u00e1\u00e2\5\4\3\2\u00e2"+
"\25\3\2\2\2\u00e3\u00e4\5\16\b\2\u00e4\u00e5\5\4\3\2\u00e5\27\3\2\2\2"+
"\u00e6\u00e7\7\4\2\2\u00e7\u00f6\5\4\3\2\u00e8\u00f6\7%\2\2\u00e9\u00f6"+
"\7&\2\2\u00ea\u00f6\7.\2\2\u00eb\u00f6\7/\2\2\u00ec\u00f6\7\60\2\2\u00ed"+
"\u00f6\7\61\2\2\u00ee\u00f6\79\2\2\u00ef\u00f6\7:\2\2\u00f0\u00f6\7C\2"+
"\2\u00f1\u00f6\7D\2\2\u00f2\u00f6\7P\2\2\u00f3\u00f6\7Q\2\2\u00f4\u00f6"+
"\7R\2\2\u00f5\u00e6\3\2\2\2\u00f5\u00e8\3\2\2\2\u00f5\u00e9\3\2\2\2\u00f5"+
"\u00ea\3\2\2\2\u00f5\u00eb\3\2\2\2\u00f5\u00ec\3\2\2\2\u00f5\u00ed\3\2"+
"\2\2\u00f5\u00ee\3\2\2\2\u00f5\u00ef\3\2\2\2\u00f5\u00f0\3\2\2\2\u00f5"+
"\u00f1\3\2\2\2\u00f5\u00f2\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f5\u00f4\3\2"+
"\2\2\u00f6\31\3\2\2\2\u00f7\u00f9\t\4\2\2\u00f8\u00fa\7+\2\2\u00f9\u00f8"+
"\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fc\3\2\2\2\u00fb\u00fd\7(\2\2\u00fc"+
"\u00fb\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00fe\3\2\2\2\u00fe\u00ff\5\f"+
"\7\2\u00ff\33\3\2\2\2\u0100\u0101\7H\2\2\u0101\u0102\5\b\5\2\u0102\35"+
"\3\2\2\2\u0103\u0105\7\37\2\2\u0104\u0106\7\65\2\2\u0105\u0104\3\2\2\2"+
"\u0105\u0106\3\2\2\2\u0106\u0107\3\2\2\2\u0107\u0108\5\f\7\2\u0108\37"+
"\3\2\2\2\u0109\u010b\7\'\2\2\u010a\u010c\7\t\2\2\u010b\u010a\3\2\2\2\u010b"+
"\u010c\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u0114\5\f\7\2\u010e\u0110\7T"+
"\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110\u0111\3\2\2\2\u0111"+
"\u0113\7\u0088\2\2\u0112\u010f\3\2\2\2\u0113\u0116\3\2\2\2\u0114\u0112"+
"\3\2\2\2\u0114\u0115\3\2\2\2\u0115!\3\2\2\2\u0116\u0114\3\2\2\2\u0117"+
"\u0118\7\64\2\2\u0118\u011a\5\b\5\2\u0119\u011b\5\34\17\2\u011a\u0119"+
"\3\2\2\2\u011a\u011b\3\2\2\2\u011b\u011d\3\2\2\2\u011c\u011e\7G\2\2\u011d"+
"\u011c\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u0120\3\2\2\2\u011f\u0121\5\36"+
"\20\2\u0120\u011f\3\2\2\2\u0120\u0121\3\2\2\2\u0121\u0123\3\2\2\2\u0122"+
"\u0124\5\32\16\2\u0123\u0122\3\2\2\2\u0123\u0124\3\2\2\2\u0124\u0126\3"+
"\2\2\2\u0125\u0127\5 \21\2\u0126\u0125\3\2\2\2\u0126\u0127\3\2\2\2\u0127"+
"#\3\2\2\2\u0128\u0129\7;\2\2\u0129\u012a\5\f\7\2\u012a%\3\2\2\2\u012b"+
"\u012c\7<\2\2\u012c\u0130\5\f\7\2\u012d\u012e\5\16\b\2\u012e\u012f\5\f"+
"\7\2\u012f\u0131\3\2\2\2\u0130\u012d\3\2\2\2\u0130\u0131\3\2\2\2\u0131"+
"\'\3\2\2\2\u0132\u0133\t\5\2\2\u0133)\3\2\2\2\u0134\u0135\t\6\2\2\u0135"+
"+\3\2\2\2\u0136\u0138\7K\2\2\u0137\u0139\7(\2\2\u0138\u0137\3\2\2\2\u0138"+
"\u0139\3\2\2\2\u0139\u013b\3\2\2\2\u013a\u0136\3\2\2\2\u013a\u013b\3\2"+
"\2\2\u013b\u013c\3\2\2\2\u013c\u013d\5(\25\2\u013d-\3\2\2\2\u013e\u0140"+
"\7K\2\2\u013f\u0141\7(\2\2\u0140\u013f\3\2\2\2\u0140\u0141\3\2\2\2\u0141"+
"\u0143\3\2\2\2\u0142\u013e\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0144\3\2"+
"\2\2\u0144\u0145\5*\26\2\u0145/\3\2\2\2\u0146\u0148\7B\2\2\u0147\u0149"+
"\7(\2\2\u0148\u0147\3\2\2\2\u0148\u0149\3\2\2\2\u0149\u014a\3\2\2\2\u014a"+
"\u014c\t\7\2\2\u014b\u014d\7>\2\2\u014c\u014b\3\2\2\2\u014c\u014d\3\2"+
"\2\2\u014d\u014f\3\2\2\2\u014e\u0150\7\n\2\2\u014f\u014e\3\2\2\2\u014f"+
"\u0150\3\2\2\2\u0150\61\3\2\2\2\u0151\u0153\t\b\2\2\u0152\u0154\7=\2\2"+
"\u0153\u0152\3\2\2\2\u0153\u0154\3\2\2\2\u0154\63\3\2\2\2\u0155\u0156"+
"\7\\\2\2\u0156\65\3\2\2\2\u0157\u015a\7X\2\2\u0158\u015a\7W\2\2\u0159"+
"\u0157\3\2\2\2\u0159\u0158\3\2\2\2\u015a\67\3\2\2\2\u015b\u0169\7^\2\2"+
"\u015c\u0169\7c\2\2\u015d\u0169\7`\2\2\u015e\u0169\7d\2\2\u015f\u0169"+
"\7e\2\2\u0160\u0169\7j\2\2\u0161\u0169\7k\2\2\u0162\u0169\7l\2\2\u0163"+
"\u0169\7m\2\2\u0164\u0169\7n\2\2\u0165\u0169\7o\2\2\u0166\u0169\7p\2\2"+
"\u0167\u0169\7q\2\2\u0168\u015b\3\2\2\2\u0168\u015c\3\2\2\2\u0168\u015d"+
"\3\2\2\2\u0168\u015e\3\2\2\2\u0168\u015f\3\2\2\2\u0168\u0160\3\2\2\2\u0168"+
"\u0161\3\2\2\2\u0168\u0162\3\2\2\2\u0168\u0163\3\2\2\2\u0168\u0164\3\2"+
"\2\2\u0168\u0165\3\2\2\2\u0168\u0166\3\2\2\2\u0168\u0167\3\2\2\2\u0169"+
"9\3\2\2\2\u016a\u016c\5\66\34\2\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2"+
"\2\u016c\u016d\3\2\2\2\u016d\u0172\58\35\2\u016e\u016f\58\35\2\u016f\u0170"+
"\5\66\34\2\u0170\u0172\3\2\2\2\u0171\u016b\3\2\2\2\u0171\u016e\3\2\2\2"+
"\u0172;\3\2\2\2\u0173\u0174\t\t\2\2\u0174=\3\2\2\2\u0175\u0176\t\n\2\2"+
"\u0176?\3\2\2\2\u0177\u0178\t\13\2\2\u0178A\3\2\2\2\u0179\u017a\t\f\2"+
"\2\u017aC\3\2\2\2\u017b\u0189\5B\"\2\u017c\u018a\5<\37\2\u017d\u018a\5"+
"@!\2\u017e\u018a\5> \2\u017f\u0181\5:\36\2\u0180\u0182\5,\27\2\u0181\u0180"+
"\3\2\2\2\u0181\u0182\3\2\2\2\u0182\u0188\3\2\2\2\u0183\u0185\5,\27\2\u0184"+
"\u0183\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0188\5:"+
"\36\2\u0187\u017f\3\2\2\2\u0187\u0184\3\2\2\2\u0188\u018a\3\2\2\2\u0189"+
"\u017c\3\2\2\2\u0189\u017d\3\2\2\2\u0189\u017e\3\2\2\2\u0189\u0187\3\2"+
"\2\2\u018a\u019a\3\2\2\2\u018b\u018d\7K\2\2\u018c\u018e\7(\2\2\u018d\u018c"+
"\3\2\2\2\u018d\u018e\3\2\2\2\u018e\u0190\3\2\2\2\u018f\u018b\3\2\2\2\u018f"+
"\u0190\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u019a\7\16\2\2\u0192\u0194\7"+
"K\2\2\u0193\u0195\7(\2\2\u0194\u0193\3\2\2\2\u0194\u0195\3\2\2\2\u0195"+
"\u0197\3\2\2\2\u0196\u0192\3\2\2\2\u0196\u0197\3\2\2\2\u0197\u0198\3\2"+
"\2\2\u0198\u019a\7\17\2\2\u0199\u017b\3\2\2\2\u0199\u018f\3\2\2\2\u0199"+
"\u0196\3\2\2\2\u019aE\3\2\2\2\u019b\u019c\t\r\2\2\u019cG\3\2\2\2\u019d"+
"\u019e\t\16\2\2\u019eI\3\2\2\2\u019f\u01a0\5F$\2\u01a0\u01a7\5\f\7\2\u01a1"+
"\u01a6\5$\23\2\u01a2\u01a6\5.\30\2\u01a3\u01a6\5\"\22\2\u01a4\u01a6\5"+
"\20\t\2\u01a5\u01a1\3\2\2\2\u01a5\u01a2\3\2\2\2\u01a5\u01a3\3\2\2\2\u01a5"+
"\u01a4\3\2\2\2\u01a6\u01a9\3\2\2\2\u01a7\u01a5\3\2\2\2\u01a7\u01a8\3\2"+
"\2\2\u01a8\u01aa\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aa\u01ab\5\64\33\2\u01ab"+
"K\3\2\2\2\u01ac\u01ad\5F$\2\u01ad\u01b7\5\f\7\2\u01ae\u01b6\5\62\32\2"+
"\u01af\u01b6\5\"\22\2\u01b0\u01b6\5D#\2\u01b1\u01b6\5$\23\2\u01b2\u01b6"+
"\5,\27\2\u01b3\u01b6\5\20\t\2\u01b4\u01b6\5\60\31\2\u01b5\u01ae\3\2\2"+
"\2\u01b5\u01af\3\2\2\2\u01b5\u01b0\3\2\2\2\u01b5\u01b1\3\2\2\2\u01b5\u01b2"+
"\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b4\3\2\2\2\u01b6\u01b9\3\2\2\2\u01b7"+
"\u01b5\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8\u01bf\3\2\2\2\u01b9\u01b7\3\2"+
"\2\2\u01ba\u01bc\7\b\2\2\u01bb\u01bd\7O\2\2\u01bc\u01bb\3\2\2\2\u01bc"+
"\u01bd\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01c0\7P\2\2\u01bf\u01ba\3\2"+
"\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01c1\3\2\2\2\u01c1\u01c2\5\64\33\2\u01c2"+
"M\3\2\2\2\u01c3\u01c4\7\u0081\2\2\u01c4\u01c5\5\f\7\2\u01c5\u01c6\5&\24"+
"\2\u01c6\u01c7\5\64\33\2\u01c7O\3\2\2\2\u01c8\u01c9\7\u0083\2\2\u01c9"+
"\u01ca\5\f\7\2\u01ca\u01cb\5\20\t\2\u01cb\u01cc\5\64\33\2\u01ccQ\3\2\2"+
"\2\u01cd\u01d5\7]\2\2\u01ce\u01d5\5J&\2\u01cf\u01d5\5L\'\2\u01d0\u01d5"+
"\5N(\2\u01d1\u01d5\5P)\2\u01d2\u01d5\5H%\2\u01d3\u01d5\5\64\33\2\u01d4"+
"\u01cd\3\2\2\2\u01d4\u01ce\3\2\2\2\u01d4\u01cf\3\2\2\2\u01d4\u01d0\3\2"+
"\2\2\u01d4\u01d1\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d3\3\2\2\2\u01d5"+
"S\3\2\2\28WZbejm\u00c5\u00cb\u00cf\u00d1\u00d5\u00da\u00df\u00f5\u00f9"+
"\u00fc\u0105\u010b\u010f\u0114\u011a\u011d\u0120\u0123\u0126\u0130\u0138"+
"\u013a\u0140\u0142\u0148\u014c\u014f\u0153\u0159\u0168\u016b\u0171\u0181"+
"\u0184\u0187\u0189\u018d\u018f\u0194\u0196\u0199\u01a5\u01a7\u01b5\u01b7"+
"\u01bc\u01bf\u01d4";
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\5\7\u00ca\n\7\3\b\3"+
"\b\3\t\3\t\5\t\u00d0\n\t\3\t\3\t\5\t\u00d4\n\t\5\t\u00d6\n\t\3\t\3\t\5"+
"\t\u00da\n\t\3\t\7\t\u00dd\n\t\f\t\16\t\u00e0\13\t\3\n\3\n\5\n\u00e4\n"+
"\n\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+
"\r\3\r\3\r\3\r\5\r\u00fa\n\r\3\16\3\16\5\16\u00fe\n\16\3\16\5\16\u0101"+
"\n\16\3\16\3\16\3\17\3\17\3\17\3\20\3\20\5\20\u010a\n\20\3\20\3\20\3\21"+
"\3\21\5\21\u0110\n\21\3\21\3\21\5\21\u0114\n\21\3\21\7\21\u0117\n\21\f"+
"\21\16\21\u011a\13\21\3\22\3\22\3\22\5\22\u011f\n\22\3\22\5\22\u0122\n"+
"\22\3\22\5\22\u0125\n\22\3\22\5\22\u0128\n\22\3\22\5\22\u012b\n\22\3\23"+
"\3\23\3\23\3\24\3\24\3\24\3\24\3\24\5\24\u0135\n\24\3\25\3\25\3\26\3\26"+
"\3\27\3\27\5\27\u013d\n\27\5\27\u013f\n\27\3\27\3\27\3\30\3\30\5\30\u0145"+
"\n\30\5\30\u0147\n\30\3\30\3\30\3\31\3\31\5\31\u014d\n\31\3\31\3\31\5"+
"\31\u0151\n\31\3\31\5\31\u0154\n\31\3\32\3\32\5\32\u0158\n\32\3\33\3\33"+
"\3\34\3\34\5\34\u015e\n\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+
"\3\35\3\35\3\35\3\35\5\35\u016d\n\35\3\36\5\36\u0170\n\36\3\36\3\36\3"+
"\36\3\36\5\36\u0176\n\36\3\37\3\37\3 \3 \3!\3!\3\"\3\"\3#\3#\3#\3#\3#"+
"\3#\5#\u0186\n#\3#\5#\u0189\n#\3#\5#\u018c\n#\5#\u018e\n#\3#\3#\5#\u0192"+
"\n#\5#\u0194\n#\3#\3#\3#\5#\u0199\n#\5#\u019b\n#\3#\5#\u019e\n#\3$\3$"+
"\3%\3%\3&\3&\3&\3&\3&\3&\7&\u01aa\n&\f&\16&\u01ad\13&\3&\3&\3\'\3\'\3"+
"\'\3\'\3\'\3\'\3\'\3\'\3\'\7\'\u01ba\n\'\f\'\16\'\u01bd\13\'\3\'\3\'\5"+
"\'\u01c1\n\'\3\'\5\'\u01c4\n\'\3\'\3\'\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3"+
"*\3*\3*\3*\3*\3*\3*\5*\u01d9\n*\3*\2\2+\2\4\6\b\n\f\16\20\22\24\26\30"+
"\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPR\2\17\4\2^^\177\u0084\4\2"+
"##JJ\4\2\6\6 \6\2\7\7\f\35!!\66\66\b\2\7\7\f\r\20\26\31\35!!\66\66\4"+
"\2,,II\3\2)*\4\2aaxx\4\2bbzz\4\2__tt\3\2\678\3\2\177\u0080\3\2?A\2\u0262"+
"\2U\3\2\2\2\4b\3\2\2\2\6q\3\2\2\2\bs\3\2\2\2\nu\3\2\2\2\f\u00c9\3\2\2"+
"\2\16\u00cb\3\2\2\2\20\u00d5\3\2\2\2\22\u00e1\3\2\2\2\24\u00e5\3\2\2\2"+
"\26\u00e7\3\2\2\2\30\u00f9\3\2\2\2\32\u00fb\3\2\2\2\34\u0104\3\2\2\2\36"+
"\u0107\3\2\2\2 \u010d\3\2\2\2\"\u011b\3\2\2\2$\u012c\3\2\2\2&\u012f\3"+
"\2\2\2(\u0136\3\2\2\2*\u0138\3\2\2\2,\u013e\3\2\2\2.\u0146\3\2\2\2\60"+
"\u014a\3\2\2\2\62\u0155\3\2\2\2\64\u0159\3\2\2\2\66\u015d\3\2\2\28\u016c"+
"\3\2\2\2:\u0175\3\2\2\2<\u0177\3\2\2\2>\u0179\3\2\2\2@\u017b\3\2\2\2B"+
"\u017d\3\2\2\2D\u019d\3\2\2\2F\u019f\3\2\2\2H\u01a1\3\2\2\2J\u01a3\3\2"+
"\2\2L\u01b0\3\2\2\2N\u01c7\3\2\2\2P\u01cc\3\2\2\2R\u01d8\3\2\2\2TV\5R"+
"*\2UT\3\2\2\2VW\3\2\2\2WU\3\2\2\2WX\3\2\2\2XZ\3\2\2\2Y[\7\u0089\2\2ZY"+
"\3\2\2\2Z[\3\2\2\2[\\\3\2\2\2\\]\7\2\2\3]\3\3\2\2\2^c\7~\2\2_c\5\6\4\2"+
"`c\5\n\6\2ac\5\30\r\2b^\3\2\2\2b_\3\2\2\2b`\3\2\2\2ba\3\2\2\2c\5\3\2\2"+
"\2df\5\66\34\2ed\3\2\2\2ef\3\2\2\2fg\3\2\2\2gr\7\u0086\2\2hr\7P\2\2ik"+
"\5\66\34\2ji\3\2\2\2jk\3\2\2\2kl\3\2\2\2lr\5\b\5\2mo\5\66\34\2nm\3\2\2"+
"\2no\3\2\2\2op\3\2\2\2pr\7j\2\2qe\3\2\2\2qh\3\2\2\2qj\3\2\2\2qn\3\2\2"+
"\2r\7\3\2\2\2st\t\2\2\2t\t\3\2\2\2uv\t\3\2\2v\13\3\2\2\2w\u00ca\7\u0088"+
"\2\2x\u00ca\7\3\2\2y\u00ca\7_\2\2z\u00ca\7`\2\2{\u00ca\7f\2\2|\u00ca\7"+
"a\2\2}\u00ca\3\2\2\2~\u00ca\7b\2\2\177\u00ca\7c\2\2\u0080\u00ca\7g\2\2"+
"\u0081\u00ca\7d\2\2\u0082\u00ca\7h\2\2\u0083\u00ca\7e\2\2\u0084\u00ca"+
"\7i\2\2\u0085\u00ca\7\u0087\2\2\u0086\u00ca\7B\2\2\u0087\u00ca\7,\2\2"+
"\u0088\u00ca\7I\2\2\u0089\u00ca\7>\2\2\u008a\u00ca\7\n\2\2\u008b\u00ca"+
"\7\6\2\2\u008c\u00ca\7 \2\2\u008d\u00ca\7+\2\2\u008e\u00ca\7\7\2\2\u008f"+
"\u00ca\7!\2\2\u0090\u00ca\7\66\2\2\u0091\u00ca\7\25\2\2\u0092\u00ca\7"+
"\26\2\2\u0093\u00ca\7\27\2\2\u0094\u00ca\7\30\2\2\u0095\u00ca\7\31\2\2"+
"\u0096\u00ca\7\32\2\2\u0097\u00ca\7\33\2\2\u0098\u00ca\7\34\2\2\u0099"+
"\u00ca\7\35\2\2\u009a\u00ca\7\f\2\2\u009b\u00ca\7\r\2\2\u009c\u00ca\7"+
"\16\2\2\u009d\u00ca\7\17\2\2\u009e\u00ca\7\20\2\2\u009f\u00ca\7\21\2\2"+
"\u00a0\u00ca\7\22\2\2\u00a1\u00ca\7\23\2\2\u00a2\u00ca\7\24\2\2\u00a3"+
"\u00ca\7;\2\2\u00a4\u00ca\7<\2\2\u00a5\u00ca\7M\2\2\u00a6\u00ca\7N\2\2"+
"\u00a7\u00ca\7\64\2\2\u00a8\u00ca\7G\2\2\u00a9\u00ca\7\37\2\2\u00aa\u00ca"+
"\7\'\2\2\u00ab\u00ca\7\b\2\2\u00ac\u00ca\7P\2\2\u00ad\u00ca\7Q\2\2\u00ae"+
"\u00ca\7R\2\2\u00af\u00ca\7C\2\2\u00b0\u00ca\7D\2\2\u00b1\u00ca\7%\2\2"+
"\u00b2\u00ca\7&\2\2\u00b3\u00ca\7.\2\2\u00b4\u00ca\7/\2\2\u00b5\u00ca"+
"\7\60\2\2\u00b6\u00ca\7\61\2\2\u00b7\u00ca\79\2\2\u00b8\u00ca\7:\2\2\u00b9"+
"\u00ca\7*\2\2\u00ba\u00ca\7)\2\2\u00bb\u00ca\7=\2\2\u00bc\u00ca\78\2\2"+
"\u00bd\u00ca\7\67\2\2\u00be\u00ca\7J\2\2\u00bf\u00ca\7#\2\2\u00c0\u00ca"+
"\7\5\2\2\u00c1\u00ca\7(\2\2\u00c2\u00ca\7\65\2\2\u00c3\u00ca\7\t\2\2\u00c4"+
"\u00ca\7O\2\2\u00c5\u00ca\7H\2\2\u00c6\u00ca\7\4\2\2\u00c7\u00ca\7K\2"+
"\2\u00c8\u00ca\7$\2\2\u00c9w\3\2\2\2\u00c9x\3\2\2\2\u00c9y\3\2\2\2\u00c9"+
"z\3\2\2\2\u00c9{\3\2\2\2\u00c9|\3\2\2\2\u00c9}\3\2\2\2\u00c9~\3\2\2\2"+
"\u00c9\177\3\2\2\2\u00c9\u0080\3\2\2\2\u00c9\u0081\3\2\2\2\u00c9\u0082"+
"\3\2\2\2\u00c9\u0083\3\2\2\2\u00c9\u0084\3\2\2\2\u00c9\u0085\3\2\2\2\u00c9"+
"\u0086\3\2\2\2\u00c9\u0087\3\2\2\2\u00c9\u0088\3\2\2\2\u00c9\u0089\3\2"+
"\2\2\u00c9\u008a\3\2\2\2\u00c9\u008b\3\2\2\2\u00c9\u008c\3\2\2\2\u00c9"+
"\u008d\3\2\2\2\u00c9\u008e\3\2\2\2\u00c9\u008f\3\2\2\2\u00c9\u0090\3\2"+
"\2\2\u00c9\u0091\3\2\2\2\u00c9\u0092\3\2\2\2\u00c9\u0093\3\2\2\2\u00c9"+
"\u0094\3\2\2\2\u00c9\u0095\3\2\2\2\u00c9\u0096\3\2\2\2\u00c9\u0097\3\2"+
"\2\2\u00c9\u0098\3\2\2\2\u00c9\u0099\3\2\2\2\u00c9\u009a\3\2\2\2\u00c9"+
"\u009b\3\2\2\2\u00c9\u009c\3\2\2\2\u00c9\u009d\3\2\2\2\u00c9\u009e\3\2"+
"\2\2\u00c9\u009f\3\2\2\2\u00c9\u00a0\3\2\2\2\u00c9\u00a1\3\2\2\2\u00c9"+
"\u00a2\3\2\2\2\u00c9\u00a3\3\2\2\2\u00c9\u00a4\3\2\2\2\u00c9\u00a5\3\2"+
"\2\2\u00c9\u00a6\3\2\2\2\u00c9\u00a7\3\2\2\2\u00c9\u00a8\3\2\2\2\u00c9"+
"\u00a9\3\2\2\2\u00c9\u00aa\3\2\2\2\u00c9\u00ab\3\2\2\2\u00c9\u00ac\3\2"+
"\2\2\u00c9\u00ad\3\2\2\2\u00c9\u00ae\3\2\2\2\u00c9\u00af\3\2\2\2\u00c9"+
"\u00b0\3\2\2\2\u00c9\u00b1\3\2\2\2\u00c9\u00b2\3\2\2\2\u00c9\u00b3\3\2"+
"\2\2\u00c9\u00b4\3\2\2\2\u00c9\u00b5\3\2\2\2\u00c9\u00b6\3\2\2\2\u00c9"+
"\u00b7\3\2\2\2\u00c9\u00b8\3\2\2\2\u00c9\u00b9\3\2\2\2\u00c9\u00ba\3\2"+
"\2\2\u00c9\u00bb\3\2\2\2\u00c9\u00bc\3\2\2\2\u00c9\u00bd\3\2\2\2\u00c9"+
"\u00be\3\2\2\2\u00c9\u00bf\3\2\2\2\u00c9\u00c0\3\2\2\2\u00c9\u00c1\3\2"+
"\2\2\u00c9\u00c2\3\2\2\2\u00c9\u00c3\3\2\2\2\u00c9\u00c4\3\2\2\2\u00c9"+
"\u00c5\3\2\2\2\u00c9\u00c6\3\2\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00c8\3\2"+
"\2\2\u00ca\r\3\2\2\2\u00cb\u00cc\7\3\2\2\u00cc\17\3\2\2\2\u00cd\u00cf"+
"\7M\2\2\u00ce\u00d0\7(\2\2\u00cf\u00ce\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0"+
"\u00d6\3\2\2\2\u00d1\u00d3\7N\2\2\u00d2\u00d4\7\5\2\2\u00d3\u00d2\3\2"+
"\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d6\3\2\2\2\u00d5\u00cd\3\2\2\2\u00d5"+
"\u00d1\3\2\2\2\u00d6\u00d7\3\2\2\2\u00d7\u00de\5\22\n\2\u00d8\u00da\7"+
"T\2\2\u00d9\u00d8\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u00db\3\2\2\2\u00db"+
"\u00dd\5\22\n\2\u00dc\u00d9\3\2\2\2\u00dd\u00e0\3\2\2\2\u00de\u00dc\3"+
"\2\2\2\u00de\u00df\3\2\2\2\u00df\21\3\2\2\2\u00e0\u00de\3\2\2\2\u00e1"+
"\u00e3\5\24\13\2\u00e2\u00e4\5\26\f\2\u00e3\u00e2\3\2\2\2\u00e3\u00e4"+
"\3\2\2\2\u00e4\23\3\2\2\2\u00e5\u00e6\5\4\3\2\u00e6\25\3\2\2\2\u00e7\u00e8"+
"\5\16\b\2\u00e8\u00e9\5\4\3\2\u00e9\27\3\2\2\2\u00ea\u00eb\7\4\2\2\u00eb"+
"\u00fa\5\4\3\2\u00ec\u00fa\7%\2\2\u00ed\u00fa\7&\2\2\u00ee\u00fa\7.\2"+
"\2\u00ef\u00fa\7/\2\2\u00f0\u00fa\7\60\2\2\u00f1\u00fa\7\61\2\2\u00f2"+
"\u00fa\79\2\2\u00f3\u00fa\7:\2\2\u00f4\u00fa\7C\2\2\u00f5\u00fa\7D\2\2"+
"\u00f6\u00fa\7P\2\2\u00f7\u00fa\7Q\2\2\u00f8\u00fa\7R\2\2\u00f9\u00ea"+
"\3\2\2\2\u00f9\u00ec\3\2\2\2\u00f9\u00ed\3\2\2\2\u00f9\u00ee\3\2\2\2\u00f9"+
"\u00ef\3\2\2\2\u00f9\u00f0\3\2\2\2\u00f9\u00f1\3\2\2\2\u00f9\u00f2\3\2"+
"\2\2\u00f9\u00f3\3\2\2\2\u00f9\u00f4\3\2\2\2\u00f9\u00f5\3\2\2\2\u00f9"+
"\u00f6\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9\u00f8\3\2\2\2\u00fa\31\3\2\2"+
"\2\u00fb\u00fd\t\4\2\2\u00fc\u00fe\7+\2\2\u00fd\u00fc\3\2\2\2\u00fd\u00fe"+
"\3\2\2\2\u00fe\u0100\3\2\2\2\u00ff\u0101\7(\2\2\u0100\u00ff\3\2\2\2\u0100"+
"\u0101\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0103\5\f\7\2\u0103\33\3\2\2"+
"\2\u0104\u0105\7H\2\2\u0105\u0106\5\b\5\2\u0106\35\3\2\2\2\u0107\u0109"+
"\7\37\2\2\u0108\u010a\7\65\2\2\u0109\u0108\3\2\2\2\u0109\u010a\3\2\2\2"+
"\u010a\u010b\3\2\2\2\u010b\u010c\5\f\7\2\u010c\37\3\2\2\2\u010d\u010f"+
"\7\'\2\2\u010e\u0110\7\t\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110"+
"\u0111\3\2\2\2\u0111\u0118\5\f\7\2\u0112\u0114\7T\2\2\u0113\u0112\3\2"+
"\2\2\u0113\u0114\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0117\7\u0088\2\2\u0116"+
"\u0113\3\2\2\2\u0117\u011a\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2"+
"\2\2\u0119!\3\2\2\2\u011a\u0118\3\2\2\2\u011b\u011c\7\64\2\2\u011c\u011e"+
"\5\b\5\2\u011d\u011f\5\34\17\2\u011e\u011d\3\2\2\2\u011e\u011f\3\2\2\2"+
"\u011f\u0121\3\2\2\2\u0120\u0122\7G\2\2\u0121\u0120\3\2\2\2\u0121\u0122"+
"\3\2\2\2\u0122\u0124\3\2\2\2\u0123\u0125\5\36\20\2\u0124\u0123\3\2\2\2"+
"\u0124\u0125\3\2\2\2\u0125\u0127\3\2\2\2\u0126\u0128\5\32\16\2\u0127\u0126"+
"\3\2\2\2\u0127\u0128\3\2\2\2\u0128\u012a\3\2\2\2\u0129\u012b\5 \21\2\u012a"+
"\u0129\3\2\2\2\u012a\u012b\3\2\2\2\u012b#\3\2\2\2\u012c\u012d\7;\2\2\u012d"+
"\u012e\5\f\7\2\u012e%\3\2\2\2\u012f\u0130\7<\2\2\u0130\u0134\5\f\7\2\u0131"+
"\u0132\5\16\b\2\u0132\u0133\5\f\7\2\u0133\u0135\3\2\2\2\u0134\u0131\3"+
"\2\2\2\u0134\u0135\3\2\2\2\u0135\'\3\2\2\2\u0136\u0137\t\5\2\2\u0137)"+
"\3\2\2\2\u0138\u0139\t\6\2\2\u0139+\3\2\2\2\u013a\u013c\7K\2\2\u013b\u013d"+
"\7(\2\2\u013c\u013b\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013f\3\2\2\2\u013e"+
"\u013a\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0141\5("+
"\25\2\u0141-\3\2\2\2\u0142\u0144\7K\2\2\u0143\u0145\7(\2\2\u0144\u0143"+
"\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0147\3\2\2\2\u0146\u0142\3\2\2\2\u0146"+
"\u0147\3\2\2\2\u0147\u0148\3\2\2\2\u0148\u0149\5*\26\2\u0149/\3\2\2\2"+
"\u014a\u014c\7B\2\2\u014b\u014d\7(\2\2\u014c\u014b\3\2\2\2\u014c\u014d"+
"\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u0150\t\7\2\2\u014f\u0151\7>\2\2\u0150"+
"\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0153\3\2\2\2\u0152\u0154\7\n"+
"\2\2\u0153\u0152\3\2\2\2\u0153\u0154\3\2\2\2\u0154\61\3\2\2\2\u0155\u0157"+
"\t\b\2\2\u0156\u0158\7=\2\2\u0157\u0156\3\2\2\2\u0157\u0158\3\2\2\2\u0158"+
"\63\3\2\2\2\u0159\u015a\7\\\2\2\u015a\65\3\2\2\2\u015b\u015e\7X\2\2\u015c"+
"\u015e\7W\2\2\u015d\u015b\3\2\2\2\u015d\u015c\3\2\2\2\u015e\67\3\2\2\2"+
"\u015f\u016d\7^\2\2\u0160\u016d\7c\2\2\u0161\u016d\7`\2\2\u0162\u016d"+
"\7d\2\2\u0163\u016d\7e\2\2\u0164\u016d\7j\2\2\u0165\u016d\7k\2\2\u0166"+
"\u016d\7l\2\2\u0167\u016d\7m\2\2\u0168\u016d\7n\2\2\u0169\u016d\7o\2\2"+
"\u016a\u016d\7p\2\2\u016b\u016d\7q\2\2\u016c\u015f\3\2\2\2\u016c\u0160"+
"\3\2\2\2\u016c\u0161\3\2\2\2\u016c\u0162\3\2\2\2\u016c\u0163\3\2\2\2\u016c"+
"\u0164\3\2\2\2\u016c\u0165\3\2\2\2\u016c\u0166\3\2\2\2\u016c\u0167\3\2"+
"\2\2\u016c\u0168\3\2\2\2\u016c\u0169\3\2\2\2\u016c\u016a\3\2\2\2\u016c"+
"\u016b\3\2\2\2\u016d9\3\2\2\2\u016e\u0170\5\66\34\2\u016f\u016e\3\2\2"+
"\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0176\58\35\2\u0172\u0173"+
"\58\35\2\u0173\u0174\5\66\34\2\u0174\u0176\3\2\2\2\u0175\u016f\3\2\2\2"+
"\u0175\u0172\3\2\2\2\u0176;\3\2\2\2\u0177\u0178\t\t\2\2\u0178=\3\2\2\2"+
"\u0179\u017a\t\n\2\2\u017a?\3\2\2\2\u017b\u017c\t\13\2\2\u017cA\3\2\2"+
"\2\u017d\u017e\t\f\2\2\u017eC\3\2\2\2\u017f\u018d\5B\"\2\u0180\u018e\5"+
"<\37\2\u0181\u018e\5@!\2\u0182\u018e\5> \2\u0183\u0185\5:\36\2\u0184\u0186"+
"\5,\27\2\u0185\u0184\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u018c\3\2\2\2\u0187"+
"\u0189\5,\27\2\u0188\u0187\3\2\2\2\u0188\u0189\3\2\2\2\u0189\u018a\3\2"+
"\2\2\u018a\u018c\5:\36\2\u018b\u0183\3\2\2\2\u018b\u0188\3\2\2\2\u018c"+
"\u018e\3\2\2\2\u018d\u0180\3\2\2\2\u018d\u0181\3\2\2\2\u018d\u0182\3\2"+
"\2\2\u018d\u018b\3\2\2\2\u018e\u019e\3\2\2\2\u018f\u0191\7K\2\2\u0190"+
"\u0192\7(\2\2\u0191\u0190\3\2\2\2\u0191\u0192\3\2\2\2\u0192\u0194\3\2"+
"\2\2\u0193\u018f\3\2\2\2\u0193\u0194\3\2\2\2\u0194\u0195\3\2\2\2\u0195"+
"\u019e\7\16\2\2\u0196\u0198\7K\2\2\u0197\u0199\7(\2\2\u0198\u0197\3\2"+
"\2\2\u0198\u0199\3\2\2\2\u0199\u019b\3\2\2\2\u019a\u0196\3\2\2\2\u019a"+
"\u019b\3\2\2\2\u019b\u019c\3\2\2\2\u019c\u019e\7\17\2\2\u019d\u017f\3"+
"\2\2\2\u019d\u0193\3\2\2\2\u019d\u019a\3\2\2\2\u019eE\3\2\2\2\u019f\u01a0"+
"\t\r\2\2\u01a0G\3\2\2\2\u01a1\u01a2\t\16\2\2\u01a2I\3\2\2\2\u01a3\u01a4"+
"\5F$\2\u01a4\u01ab\5\f\7\2\u01a5\u01aa\5$\23\2\u01a6\u01aa\5.\30\2\u01a7"+
"\u01aa\5\"\22\2\u01a8\u01aa\5\20\t\2\u01a9\u01a5\3\2\2\2\u01a9\u01a6\3"+
"\2\2\2\u01a9\u01a7\3\2\2\2\u01a9\u01a8\3\2\2\2\u01aa\u01ad\3\2\2\2\u01ab"+
"\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ae\3\2\2\2\u01ad\u01ab\3\2"+
"\2\2\u01ae\u01af\5\64\33\2\u01afK\3\2\2\2\u01b0\u01b1\5F$\2\u01b1\u01bb"+
"\5\f\7\2\u01b2\u01ba\5\62\32\2\u01b3\u01ba\5\"\22\2\u01b4\u01ba\5D#\2"+
"\u01b5\u01ba\5$\23\2\u01b6\u01ba\5,\27\2\u01b7\u01ba\5\20\t\2\u01b8\u01ba"+
"\5\60\31\2\u01b9\u01b2\3\2\2\2\u01b9\u01b3\3\2\2\2\u01b9\u01b4\3\2\2\2"+
"\u01b9\u01b5\3\2\2\2\u01b9\u01b6\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01b8"+
"\3\2\2\2\u01ba\u01bd\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bb\u01bc\3\2\2\2\u01bc"+
"\u01c3\3\2\2\2\u01bd\u01bb\3\2\2\2\u01be\u01c0\7\b\2\2\u01bf\u01c1\7O"+
"\2\2\u01c0\u01bf\3\2\2\2\u01c0\u01c1\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2"+
"\u01c4\7P\2\2\u01c3\u01be\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\3\2"+
"\2\2\u01c5\u01c6\5\64\33\2\u01c6M\3\2\2\2\u01c7\u01c8\7\u0081\2\2\u01c8"+
"\u01c9\5\f\7\2\u01c9\u01ca\5&\24\2\u01ca\u01cb\5\64\33\2\u01cbO\3\2\2"+
"\2\u01cc\u01cd\7\u0083\2\2\u01cd\u01ce\5\f\7\2\u01ce\u01cf\5\20\t\2\u01cf"+
"\u01d0\5\64\33\2\u01d0Q\3\2\2\2\u01d1\u01d9\7]\2\2\u01d2\u01d9\5J&\2\u01d3"+
"\u01d9\5L\'\2\u01d4\u01d9\5N(\2\u01d5\u01d9\5P)\2\u01d6\u01d9\5H%\2\u01d7"+
"\u01d9\5\64\33\2\u01d8\u01d1\3\2\2\2\u01d8\u01d2\3\2\2\2\u01d8\u01d3\3"+
"\2\2\2\u01d8\u01d4\3\2\2\2\u01d8\u01d5\3\2\2\2\u01d8\u01d6\3\2\2\2\u01d8"+
"\u01d7\3\2\2\2\u01d9S\3\2\2\29WZbejnq\u00c9\u00cf\u00d3\u00d5\u00d9\u00de"+
"\u00e3\u00f9\u00fd\u0100\u0109\u010f\u0113\u0118\u011e\u0121\u0124\u0127"+
"\u012a\u0134\u013c\u013e\u0144\u0146\u014c\u0150\u0153\u0157\u015d\u016c"+
"\u016f\u0175\u0185\u0188\u018b\u018d\u0191\u0193\u0198\u019a\u019d\u01a9"+
"\u01ab\u01b9\u01bb\u01c0\u01c3\u01d8";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check whether ANTLR4 code generation is wired into the build,
# so this generated parser file is produced automatically rather than hand-edited.
set -euo pipefail

echo "== Search build files for antlr4 plugin configuration =="
rg -n -i 'antlr' --glob 'build.sbt' --glob '*.sbt' --glob 'pom.xml' --glob 'plugins.sbt' . 2>/dev/null || true

echo "== Locate the grammar file and generated parser to compare timestamps/paths =="
fd -a 'copybookParser.g4'
fd -a 'copybookParser.java'

Repository: AbsaOSS/cobrix

Length of output: 1002


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== cobol-parser/pom.xml relevant sections =="
wc -l cobol-parser/pom.xml build.sbt
sed -n '1,220p' cobol-parser/pom.xml

echo
echo "== build.sbt ANTLR references with context =="
sed -n '55,170p' build.sbt

echo
echo "== ANTLR plugin references in repository =="
rg -n -i 'antlr4-maven-plugin|org.antlr.apache|antlr4|antlr' --glob 'pom.xml' --glob '*.xml' --glob '*.sbt' --glob 'build.groovy' --glob '*.gradle' .

Repository: AbsaOSS/cobrix

Length of output: 7324


Wire the generated parser into ANTLR4 code generation.

cobol-parser/pom.xml only declares antlr4-runtime, and the ANTLR plugin is not configured. Add an ANTLR4 build task that generates copybookParser.java from copybookParser.g4 before committing the regenerated parser file.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/antlr/copybookParser.java`
around lines 3866 - 4067, Configure the ANTLR4 Maven generation task in pom.xml,
adding the ANTLR plugin and grammar source setup so copybookParser.g4 generates
copybookParser.java during the build before compilation. Keep the generated
parser synchronized with the grammar and retain antlr4-runtime for runtime
usage.

@yruslan
yruslan merged commit 82865d9 into master Jul 31, 2026
7 checks passed
@yruslan
yruslan deleted the bugfix/727-parse-999-9999-values branch July 31, 2026 07:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

za.co.absa.cobrix.cobol.parser.exceptions.SyntaxErrorException: Syntax error in the copybook at line 95: Invalid input '999.9999' at position 95:63

1 participant