EGL is a fourth-generation language whose deliverable is generated code: you write EGL, the toolchain generates COBOL, Java or JavaScript. That design decision is why get dept;, add dept;, replace dept; and open deptSet for dept; carry no SQL text. The generator worked it out from declarations. So must anything that wants to know what the application touches.
The grammar covers the whole RBD and EDT declaration vocabulary — program, standalone function, library, record, handler, service, interface, delegate, dataItem, dataTable, externalType, enumeration and formGroup, each with its stereotype slot. The SQL-bearing statements are modeled as first-class nodes with their options: forUpdate, singleRow, from, scroll, hold, cursor, noCursor, usingKeys.
But the grammar is the smaller half, and saying so is the most useful thing this page can do. The semantics module resolves record variables to their declarations across files, function calls to their definitions, field references into record structures — and, specifically, the implicit-SQL statements to the records they read. There are test suites named GetStatementResolutionTest, OpenStatementResolutionTest, CrossFileMemberResolutionTest, RecordsFieldsResolutionTest and FunctionResolutionTest. Tests named after the hard problem are better evidence than an adjective.
Explicit SQL exists too, in #sql{ … } blocks with EGL host expressions interpolated as :dept.id. Those blocks are lexed as a single brace-nesting-aware token and preserved verbatim, with the surrounding statement fully structured. There is also #sqlcondition{ }, and prepare … from “…”, which is SQL assembled at run time and opaque to everyone.
One relief after RPG and COBOL, and worth saying plainly rather than pretending all legacy looks alike: EGL is free-format text. No columns, no card image, no indicator area, no EBCDIC archaeology. It also has no preprocessor — no COPY, no include, no macro pass. Reuse is by package and import. All the difficulty moved from preprocessing into cross-file resolution.