aboutsummaryrefslogtreecommitdiff
path: root/src/wkt2_grammar.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/wkt2_grammar.y')
-rw-r--r--src/wkt2_grammar.y1499
1 files changed, 1499 insertions, 0 deletions
diff --git a/src/wkt2_grammar.y b/src/wkt2_grammar.y
new file mode 100644
index 00000000..f028eb5b
--- /dev/null
+++ b/src/wkt2_grammar.y
@@ -0,0 +1,1499 @@
+%{
+/******************************************************************************
+ * Project: PROJ
+ * Purpose: WKT2 parser grammar
+ * Author: Even Rouault, <even.rouault at spatialys.com>
+ *
+ ******************************************************************************
+ * Copyright (c) 2018 Even Rouault, <even.rouault at spatialys.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#include "wkt2_parser.h"
+
+%}
+
+%define api.pure
+%define parse.error verbose
+%require "3.0"
+
+%parse-param {pj_wkt2_parse_context *context}
+%lex-param {pj_wkt2_parse_context *context}
+
+/* From WKT1 */
+%token T_PROJECTION "PROJECTION"
+%token T_DATUM "DATUM"
+%token T_SPHEROID "SPHEROID"
+%token T_PRIMEM "PRIMEM"
+%token T_UNIT "UNIT"
+%token T_AXIS "AXIS"
+%token T_PARAMETER "PARAMETER"
+
+/* WKT2 preferred */
+%token T_GEODCRS "GEODCRS";
+%token T_LENGTHUNIT "LENGTHUNIT";
+%token T_ANGLEUNIT "ANGLEUNIT";
+%token T_SCALEUNIT "SCALEUNIT";
+%token T_TIMEUNIT "TIMEUNIT";
+%token T_ELLIPSOID "ELLIPSOID";
+%token T_CS "CS";
+%token T_ID "ID";
+%token T_PROJCRS "PROJCRS";
+%token T_BASEGEODCRS "BASEGEODCRS";
+%token T_MERIDIAN "MERIDIAN";
+%token T_BEARING "BEARING";
+%token T_ORDER "ORDER";
+%token T_ANCHOR "ANCHOR";
+%token T_CONVERSION "CONVERSION";
+%token T_METHOD "METHOD";
+%token T_REMARK "REMARK";
+%token T_GEOGCRS "GEOGCRS";
+%token T_BASEGEOGCRS "BASEGEOGCRS";
+%token T_SCOPE "SCOPE";
+%token T_AREA "AREA";
+%token T_BBOX "BBOX";
+%token T_CITATION "CITATION";
+%token T_URI "URI";
+%token T_VERTCRS "VERTCRS";
+%token T_VDATUM "VDATUM";
+%token T_GEOIDMODEL "GEOIDMODEL";
+%token T_COMPOUNDCRS "COMPOUNDCRS";
+%token T_PARAMETERFILE "PARAMETERFILE";
+%token T_COORDINATEOPERATION "COORDINATEOPERATION";
+%token T_SOURCECRS "SOURCECRS";
+%token T_TARGETCRS "TARGETCRS";
+%token T_INTERPOLATIONCRS "INTERPOLATIONCRS";
+%token T_OPERATIONACCURACY "OPERATIONACCURACY";
+%token T_CONCATENATEDOPERATION "CONCATENATEDOPERATION";
+%token T_STEP "STEP";
+%token T_BOUNDCRS "BOUNDCRS";
+%token T_ABRIDGEDTRANSFORMATION "ABRIDGEDTRANSFORMATION";
+%token T_DERIVINGCONVERSION "DERIVINGCONVERSION";
+%token T_TDATUM "TDATUM";
+%token T_CALENDAR "CALENDAR";
+%token T_TIMEORIGIN "TIMEORIGIN";
+%token T_TIMECRS "TIMECRS";
+%token T_VERTICALEXTENT "VERTICALEXTENT";
+%token T_TIMEEXTENT "TIMEEXTENT";
+%token T_USAGE "USAGE";
+%token T_DYNAMIC "DYNAMIC";
+%token T_FRAMEEPOCH "FRAMEEPOCH";
+%token T_MODEL "MODEL";
+%token T_VELOCITYGRID "VELOCITYGRID";
+%token T_ENSEMBLE "ENSEMBLE";
+%token T_MEMBER "MEMBER";
+%token T_ENSEMBLEACCURACY "ENSEMBLEACCURACY";
+%token T_DERIVEDPROJCRS "DERIVEDPROJCRS";
+%token T_BASEPROJCRS "BASEPROJCRS";
+%token T_EDATUM "EDATUM";
+%token T_ENGCRS "ENGCRS";
+%token T_PDATUM "PDATUM";
+%token T_PARAMETRICCRS "PARAMETRICCRS";
+%token T_PARAMETRICUNIT "PARAMETRICUNIT";
+%token T_BASEVERTCRS "BASEVERTCRS";
+%token T_BASEENGCRS "BASEENGCRS";
+%token T_BASEPARAMCRS "BASEPARAMCRS";
+%token T_BASETIMECRS "BASETIMECRS";
+%token T_EPOCH "EPOCH"
+%token T_COORDEPOCH "COORDEPOCH"
+%token T_COORDINATEMETADATA "COORDINATEMETADATA"
+%token T_POINTMOTIONOPERATION "POINTMOTIONOPERATION"
+
+/* WKT2 alternate (longer or shorter) */
+%token T_GEODETICCRS "GEODETICCRS";
+%token T_GEODETICDATUM "GEODETICDATUM";
+%token T_PROJECTEDCRS "PROJECTEDCRS";
+%token T_PRIMEMERIDIAN "PRIMEMERIDIAN";
+%token T_GEOGRAPHICCRS "GEOGRAPHICCRS";
+%token T_TRF "TRF";
+%token T_VERTICALCRS "VERTICALCRS";
+%token T_VERTICALDATUM "VERTICALDATUM";
+%token T_VRF "VRF";
+%token T_TIMEDATUM "TIMEDATUM";
+%token T_TEMPORALQUANTITY "TEMPORALQUANTITY";
+%token T_ENGINEERINGDATUM "ENGINEERINGDATUM";
+%token T_ENGINEERINGCRS "ENGINEERINGCRS";
+%token T_PARAMETRICDATUM "PARAMETRICDATUM";
+
+
+/* CS types */
+%token T_AFFINE "affine";
+%token T_CARTESIAN "Cartesian";
+%token T_CYLINDRICAL "cylindrical";
+%token T_ELLIPSOIDAL "ellipsoidal";
+%token T_LINEAR "linear";
+%token T_PARAMETRIC "parametric";
+%token T_POLAR "polar";
+%token T_SPHERICAL "spherical";
+%token T_VERTICAL "vertical";
+%token T_TEMPORAL "temporal"; // WKT2_2015 only
+%token T_TEMPORALCOUNT "temporalCount";
+%token T_TEMPORALMEASURE "temporalMeasure";
+%token T_ORDINAL "ordinal";
+%token T_TEMPORALDATETIME "temporalDateTime";
+
+/* Axis directions */
+%token T_NORTH "north";
+%token T_NORTHNORTHEAST "northNorthEast";
+%token T_NORTHEAST "northEast";
+%token T_EASTNORTHEAST "eastNorthEast";
+%token T_EAST "east";
+%token T_EASTSOUTHEAST "eastSouthEast";
+%token T_SOUTHEAST "southEast";
+%token T_SOUTHSOUTHEAST "southSouthEast";
+%token T_SOUTH "south";
+%token T_SOUTHSOUTHWEST "southSouthWest";
+%token T_SOUTHWEST "southWest";
+%token T_WESTSOUTHWEST "westSouthWest";
+%token T_WEST "west";
+%token T_WESTNORTHWEST "westNorthWest";
+%token T_NORTHWEST "northWest";
+%token T_NORTHNORTHWEST "northNorthWest";
+%token T_UP "up";
+%token T_DOWN "down";
+%token T_GEOCENTRICX "geocentricX";
+%token T_GEOCENTRICY "geocentricY";
+%token T_GEOCENTRICZ "geocentricZ";
+%token T_COLUMNPOSITIVE "columnPositive";
+%token T_COLUMNNEGATIVE "columnNegative";
+%token T_ROWPOSITIVE "rowPositive";
+%token T_ROWNEGATIVE "rowNegative";
+%token T_DISPLAYRIGHT "displayRight";
+%token T_DISPLAYLEFT "displayLeft";
+%token T_DISPLAYUP "displayUp";
+%token T_DISPLAYDOWN "displayDown";
+%token T_FORWARD "forward";
+%token T_AFT "aft";
+%token T_PORT "port";
+%token T_STARBOARD "starboard";
+%token T_CLOCKWISE "clockwise";
+%token T_COUNTERCLOCKWISE "counterClockwise";
+%token T_TOWARDS "towards";
+%token T_AWAYFROM "awayFrom";
+%token T_FUTURE "future";
+%token T_PAST "part";
+%token T_UNSPECIFIED "unspecified";
+
+
+%token T_STRING "string"
+%token T_UNSIGNED_INTEGER_DIFFERENT_ONE_TWO_THREE "unsigned integer"
+
+%token END 0 "end of string"
+
+%%
+
+/* Derived from BNF grammar in OGC 18-010r3 (WKT2:2018), with a few back
+ additions from GC 12-063r5 (WKT2:2015) */
+
+input:
+ identifier | ellipsoid | datum | crs | bound_crs | coordinate_metadata |
+ coordinate_operation | point_motion_operation | concatenated_operation |
+ map_projection
+
+datum:
+ geodetic_reference_frame_without_pm | datum_ensemble |
+ vertical_reference_frame | engineering_datum | parametric_datum |
+ temporal_datum
+
+crs:
+ geodetic_crs | projected_crs | vertical_crs | engineering_crs |
+ parametric_crs | temporal_crs | derived_geodetic_crs | derived_geographic_crs |
+ derived_projected_crs | derived_vertical_crs | derived_engineering_crs |
+ derived_parametric_crs | derived_temporal_crs | compound_crs
+
+// Basic characters
+
+period: '.'
+
+// Numbers
+
+number: signed_numeric_literal_with_sign | unsigned_numeric_literal
+
+signed_numeric_literal_with_sign: sign unsigned_numeric_literal
+
+signed_numeric_literal: opt_sign unsigned_numeric_literal
+
+unsigned_numeric_literal: exact_numeric_literal | approximate_numeric_literal
+
+opt_sign: | sign
+
+approximate_numeric_literal: mantissa 'E' exponent
+
+mantissa: exact_numeric_literal
+
+exponent: signed_integer
+
+signed_integer: opt_sign unsigned_integer
+
+exact_numeric_literal: unsigned_integer opt_period_unsigned_integer | period unsigned_integer
+
+opt_period_unsigned_integer: | period unsigned_integer
+
+unsigned_integer: '1' | '2' | '3' | T_UNSIGNED_INTEGER_DIFFERENT_ONE_TWO_THREE
+
+sign: '+' | '-'
+
+// Date and time
+
+colon: ':'
+
+hyphen: '-'
+
+// Significantly modified to avoid shift-reduce ambiguities for Bison
+datetime:
+ year opt_24_hour_clock
+ | year hyphen unsigned_integer opt_24_hour_clock
+ | year hyphen month hyphen day opt_24_hour_clock
+
+opt_24_hour_clock: | _24_hour_clock
+
+year: unsigned_integer
+
+month: unsigned_integer
+
+day: unsigned_integer
+
+_24_hour_clock: time_designator hour
+ opt_colon_minute_colon_second_time_zone_designator
+
+opt_colon_minute_colon_second_time_zone_designator:
+ colon minute opt_colon_second_time_zone_designator
+ | time_zone_designator
+
+opt_colon_second_time_zone_designator:
+ colon second_time_zone_designator
+ | time_zone_designator
+
+time_designator: 'T'
+
+hour: unsigned_integer
+
+minute: unsigned_integer
+
+second_time_zone_designator:
+ seconds_integer period time_zone_designator
+ | seconds_integer period seconds_fraction time_zone_designator
+ | seconds_integer time_zone_designator
+
+seconds_integer: unsigned_integer
+
+seconds_fraction: unsigned_integer
+
+time_zone_designator: utc_designator | local_time_zone_designator
+
+utc_designator: 'Z'
+
+local_time_zone_designator:
+ sign hour opt_colon_minute
+ | hour opt_colon_minute
+
+opt_colon_minute: | colon minute
+
+
+// CRS WKT characters
+
+left_delimiter: '[' | '('
+
+right_delimiter: ']' | ')'
+
+wkt_separator: ','
+
+quoted_latin_text: T_STRING
+
+quoted_unicode_text: T_STRING
+
+// Scope, extent, identifier and remark
+
+opt_separator_scope_extent_identifier_remark:
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+no_opt_separator_scope_extent_identifier_remark:
+ scope_extent_opt_identifier_list_opt_remark
+ | identifier opt_identifier_list_remark
+ | remark
+
+opt_identifier_list_remark: | wkt_separator identifier opt_identifier_list_remark
+ | wkt_separator remark
+
+scope_extent_opt_identifier_list_opt_remark:
+ scope_extent_opt_identifier_list_remark
+ | usage_list_opt_identifier_list_remark
+
+// WKT2-2015 way
+scope_extent_opt_identifier_list_remark:
+ scope wkt_separator extent_opt_identifier_list_remark
+ | scope opt_identifier_list_remark
+ | extent_opt_identifier_list_remark
+
+// WKT2-2018 way
+usage_list_opt_identifier_list_remark:
+ usage
+ | usage wkt_separator remark
+ | usage wkt_separator identifier opt_identifier_list_remark
+ | usage wkt_separator usage_list_opt_identifier_list_remark
+
+usage: usage_keyword left_delimiter
+ scope wkt_separator extent
+ right_delimiter
+
+usage_keyword: T_USAGE
+
+scope: scope_keyword left_delimiter
+ scope_text_description right_delimiter
+
+scope_keyword: T_SCOPE
+
+scope_text_description: quoted_latin_text
+
+extent:
+ area_description
+ | geographic_bounding_box
+ | vertical_extent
+ | temporal_extent
+ | area_description wkt_separator geographic_bounding_box
+ | area_description wkt_separator vertical_extent
+ | area_description wkt_separator temporal_extent
+ | geographic_bounding_box wkt_separator vertical_extent
+ | geographic_bounding_box wkt_separator temporal_extent
+ | vertical_extent wkt_separator temporal_extent
+ | area_description wkt_separator geographic_bounding_box wkt_separator vertical_extent
+ | area_description wkt_separator geographic_bounding_box wkt_separator temporal_extent
+ | area_description wkt_separator vertical_extent wkt_separator temporal_extent
+ | geographic_bounding_box wkt_separator vertical_extent wkt_separator temporal_extent
+ | area_description wkt_separator geographic_bounding_box wkt_separator vertical_extent wkt_separator temporal_extent
+
+extent_opt_identifier_list_remark:
+ area_description opt_identifier_list_remark
+ | geographic_bounding_box opt_identifier_list_remark
+ | vertical_extent opt_identifier_list_remark
+ | temporal_extent opt_identifier_list_remark
+ | area_description wkt_separator geographic_bounding_box opt_identifier_list_remark
+ | area_description wkt_separator vertical_extent opt_identifier_list_remark
+ | area_description wkt_separator temporal_extent opt_identifier_list_remark
+ | geographic_bounding_box wkt_separator vertical_extent opt_identifier_list_remark
+ | geographic_bounding_box wkt_separator temporal_extent opt_identifier_list_remark
+ | vertical_extent wkt_separator temporal_extent opt_identifier_list_remark
+ | area_description wkt_separator geographic_bounding_box wkt_separator vertical_extent opt_identifier_list_remark
+ | area_description wkt_separator geographic_bounding_box wkt_separator temporal_extent opt_identifier_list_remark
+ | area_description wkt_separator vertical_extent wkt_separator temporal_extent opt_identifier_list_remark
+ | geographic_bounding_box wkt_separator vertical_extent wkt_separator temporal_extent opt_identifier_list_remark
+ | area_description wkt_separator geographic_bounding_box wkt_separator vertical_extent wkt_separator temporal_extent opt_identifier_list_remark
+
+// Area description
+
+area_description: area_description_keyword left_delimiter area_text_description right_delimiter
+
+area_description_keyword: T_AREA
+
+area_text_description: quoted_latin_text
+
+// Geographic bounding box
+
+geographic_bounding_box: geographic_bounding_box_keyword left_delimiter
+ lower_left_latitude wkt_separator lower_left_longitude
+ wkt_separator upper_right_latitude wkt_separator
+ upper_right_longitude right_delimiter
+
+geographic_bounding_box_keyword: T_BBOX
+
+lower_left_latitude: number
+
+lower_left_longitude: number
+
+upper_right_latitude: number
+
+upper_right_longitude: number
+
+// Vertical extent
+
+vertical_extent: vertical_extent_keyword left_delimiter
+ vertical_extent_minimum_height wkt_separator
+ vertical_extent_maximum_height
+ opt_separator_length_unit right_delimiter
+
+opt_separator_length_unit:
+ | wkt_separator length_unit
+
+vertical_extent_keyword: T_VERTICALEXTENT
+
+vertical_extent_minimum_height: number
+
+vertical_extent_maximum_height: number
+
+// Temporal extent
+
+temporal_extent: temporal_extent_keyword left_delimiter
+ temporal_extent_start wkt_separator
+ temporal_extent_end right_delimiter
+
+temporal_extent_keyword: T_TIMEEXTENT
+
+temporal_extent_start: datetime | quoted_latin_text
+
+temporal_extent_end: datetime | quoted_latin_text
+
+
+// Identifier
+
+identifier: identifier_keyword left_delimiter authority_name
+ wkt_separator authority_unique_identifier
+ opt_version_authority_citation_uri
+ right_delimiter
+
+opt_version_authority_citation_uri:
+ | wkt_separator version
+ | wkt_separator version wkt_separator authority_citation
+ | wkt_separator version wkt_separator authority_citation wkt_separator id_uri
+ | wkt_separator authority_citation
+ | wkt_separator authority_citation wkt_separator id_uri
+ | wkt_separator id_uri
+
+identifier_keyword: T_ID
+
+authority_name: quoted_latin_text
+
+authority_unique_identifier: number | quoted_latin_text
+
+version: number | quoted_latin_text
+
+authority_citation: citation_keyword left_delimiter citation right_delimiter
+
+citation_keyword: T_CITATION
+
+citation: quoted_latin_text
+
+id_uri: uri_keyword left_delimiter uri right_delimiter
+
+uri_keyword: T_URI
+
+uri: quoted_latin_text
+
+// Remark
+
+remark: remark_keyword left_delimiter quoted_unicode_text right_delimiter
+
+remark_keyword: T_REMARK
+
+// Unit
+
+unit: spatial_unit | time_unit
+
+//spatial_unit: angle_unit | length_unit | parametric_unit | scale_unit
+spatial_unit: angle_or_length_or_parametric_or_scale_unit
+
+angle_or_length_or_parametric_or_scale_unit:
+ angle_or_length_or_parametric_or_scale_unit_keyword
+ left_delimiter unit_name
+ wkt_separator conversion_factor
+ opt_separator_identifier_list right_delimiter
+
+angle_or_length_or_parametric_or_scale_unit_keyword: T_ANGLEUNIT | T_LENGTHUNIT | T_PARAMETRICUNIT | T_SCALEUNIT | T_UNIT
+
+angle_or_length_or_scale_unit:
+ angle_or_length_or_scale_unit_keyword
+ left_delimiter unit_name
+ wkt_separator conversion_factor
+ opt_separator_identifier_list right_delimiter
+
+angle_or_length_or_scale_unit_keyword: T_ANGLEUNIT | T_LENGTHUNIT | T_SCALEUNIT | T_UNIT
+
+
+angle_unit: angle_unit_keyword left_delimiter unit_name
+ wkt_separator conversion_factor
+ opt_separator_identifier_list right_delimiter
+
+opt_separator_identifier_list:
+ | wkt_separator identifier opt_separator_identifier_list
+
+length_unit: length_unit_keyword left_delimiter unit_name
+ wkt_separator conversion_factor
+ opt_separator_identifier_list right_delimiter
+
+/*
+parametric_unit: parametric_unit_keyword left_delimiter unit_name
+ wkt_separator conversion_factor
+ opt_separator_identifier_list right_delimiter
+*/
+
+/*
+scale_unit: scale_unit_keyword left_delimiter unit_name
+ wkt_separator conversion_factor
+ opt_separator_identifier_list right_delimiter
+*/
+
+time_unit: time_unit_keyword left_delimiter unit_name
+ opt_separator_conversion_factor_identifier_list
+ right_delimiter
+
+opt_separator_conversion_factor_identifier_list:
+ | wkt_separator conversion_factor opt_separator_identifier_list
+
+angle_unit_keyword: T_ANGLEUNIT | T_UNIT
+
+length_unit_keyword: T_LENGTHUNIT | T_UNIT
+
+// parametric_unit_keyword: T_PARAMETRICUNIT
+
+// scale_unit_keyword: T_SCALEUNIT | T_UNIT
+
+time_unit_keyword: T_TIMEUNIT | T_TEMPORALQUANTITY
+
+unit_name: quoted_latin_text
+
+conversion_factor: unsigned_numeric_literal
+
+
+// Coordinate system
+
+// coordinate_system: spatial_cs | temporalcountmeasure_cs | ordinatedatetime_cs
+
+coordinate_system_scope_extent_identifier_remark: spatial_cs_scope_extent_identifier_remark | temporalcountmeasure_cs_scope_extent_identifier_remark | ordinaldatetime_cs_scope_extent_identifier_remark
+
+spatial_cs_scope_extent_identifier_remark: cs_keyword left_delimiter spatial_cs_type
+ wkt_separator dimension
+ opt_separator_identifier_list
+ right_delimiter
+ wkt_separator spatial_axis
+ opt_separator_spatial_axis_list_opt_separator_cs_unit_scope_extent_identifier_remark
+
+opt_separator_spatial_axis_list_opt_separator_cs_unit_scope_extent_identifier_remark:
+ | wkt_separator cs_unit opt_separator_scope_extent_identifier_remark
+ | wkt_separator spatial_axis opt_separator_spatial_axis_list_opt_separator_cs_unit_scope_extent_identifier_remark
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+temporalcountmeasure_cs_scope_extent_identifier_remark: cs_keyword left_delimiter temporalcountmeasure_cs_type
+ wkt_separator dimension
+ opt_separator_identifier_list
+ right_delimiter
+ wkt_separator temporalcountmeasure_axis
+ opt_separator_scope_extent_identifier_remark
+
+ordinaldatetime_cs_scope_extent_identifier_remark: cs_keyword left_delimiter ordinaldatetime_cs_type
+ wkt_separator dimension
+ opt_separator_identifier_list
+ right_delimiter
+ wkt_separator ordinaldatetime_axis
+ opt_separator_ordinaldatetime_axis_list_scope_extent_identifier_remark
+
+opt_separator_ordinaldatetime_axis_list_scope_extent_identifier_remark:
+ | wkt_separator ordinaldatetime_axis opt_separator_ordinaldatetime_axis_list_scope_extent_identifier_remark
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+cs_keyword: T_CS
+
+spatial_cs_type: T_AFFINE | T_CARTESIAN | T_CYLINDRICAL | T_ELLIPSOIDAL | T_LINEAR | T_PARAMETRIC | T_POLAR | T_SPHERICAL | T_VERTICAL
+
+// T_TEMPORAL: WKT2_2015
+temporalcountmeasure_cs_type: T_TEMPORAL | T_TEMPORALCOUNT | T_TEMPORALMEASURE
+
+ordinaldatetime_cs_type: T_ORDINAL | T_TEMPORALDATETIME
+
+dimension: '1' | '2' | '3'
+
+spatial_axis: axis_keyword left_delimiter axis_name_abbrev
+ wkt_separator
+ axis_direction_opt_axis_order_spatial_unit_identifier_list
+ right_delimiter
+
+temporalcountmeasure_axis: axis_keyword left_delimiter axis_name_abbrev
+ wkt_separator
+ axis_direction_except_n_s_cw_ccw
+ opt_separator_axis_time_unit_identifier_list
+ right_delimiter
+
+ordinaldatetime_axis: axis_keyword left_delimiter axis_name_abbrev
+ wkt_separator
+ axis_direction_opt_axis_order_identifier_list
+ right_delimiter
+
+axis_keyword: T_AXIS
+
+// Approximation of <double quote> { <axis name> | <axis abbreviation> | <axis name and abbrev> } <double quote>
+axis_name_abbrev: quoted_latin_text
+
+axis_direction_opt_axis_order_spatial_unit_identifier_list:
+ axis_direction_except_n_s_cw_ccw_opt_axis_spatial_unit_identifier_list
+ | T_NORTH
+ | T_NORTH wkt_separator north_south_options_spatial_unit
+ | T_SOUTH
+ | T_SOUTH wkt_separator north_south_options_spatial_unit
+ | T_CLOCKWISE
+ | T_CLOCKWISE wkt_separator clockwise_counter_clockwise_options_spatial_unit
+ | T_COUNTERCLOCKWISE
+ | T_COUNTERCLOCKWISE wkt_separator clockwise_counter_clockwise_options_spatial_unit
+
+north_south_options_spatial_unit:
+ identifier opt_separator_identifier_list
+ | meridian wkt_separator axis_order opt_separator_identifier_list
+ | meridian wkt_separator axis_order wkt_separator spatial_unit opt_separator_identifier_list
+ | meridian wkt_separator spatial_unit opt_separator_identifier_list
+ | meridian opt_separator_identifier_list
+ | axis_order wkt_separator spatial_unit opt_separator_identifier_list
+ | axis_order opt_separator_identifier_list
+ | spatial_unit opt_separator_identifier_list
+
+clockwise_counter_clockwise_options_spatial_unit:
+ identifier opt_separator_identifier_list
+ | bearing wkt_separator axis_order opt_separator_identifier_list
+ | bearing wkt_separator axis_order wkt_separator spatial_unit opt_separator_identifier_list
+ | bearing wkt_separator spatial_unit opt_separator_identifier_list
+ | bearing opt_separator_identifier_list
+ | axis_order wkt_separator spatial_unit opt_separator_identifier_list
+ | axis_order opt_separator_identifier_list
+ | spatial_unit opt_separator_identifier_list
+
+axis_direction_except_n_s_cw_ccw_opt_axis_spatial_unit_identifier_list:
+ axis_direction_except_n_s_cw_ccw
+ | axis_direction_except_n_s_cw_ccw wkt_separator axis_direction_except_n_s_cw_ccw_opt_axis_spatial_unit_identifier_list_options
+
+axis_direction_except_n_s_cw_ccw_opt_axis_spatial_unit_identifier_list_options:
+ identifier opt_separator_identifier_list
+ | axis_order opt_separator_identifier_list
+ | axis_order wkt_separator spatial_unit opt_separator_identifier_list
+ | spatial_unit opt_separator_identifier_list
+
+
+
+axis_direction_opt_axis_order_identifier_list:
+ axis_direction_except_n_s_cw_ccw_opt_axis_identifier_list
+ | T_NORTH
+ | T_NORTH wkt_separator north_south_options
+ | T_SOUTH
+ | T_SOUTH wkt_separator north_south_options_spatial_unit
+ | T_CLOCKWISE
+ | T_CLOCKWISE wkt_separator clockwise_counter_clockwise_options
+ | T_COUNTERCLOCKWISE
+ | T_COUNTERCLOCKWISE wkt_separator clockwise_counter_clockwise_options
+
+north_south_options:
+ identifier opt_separator_identifier_list
+ | meridian wkt_separator axis_order opt_separator_identifier_list
+ | meridian opt_separator_identifier_list
+ | axis_order opt_separator_identifier_list
+
+clockwise_counter_clockwise_options:
+ identifier opt_separator_identifier_list
+ | bearing wkt_separator axis_order opt_separator_identifier_list
+ | bearing opt_separator_identifier_list
+ | axis_order opt_separator_identifier_list
+
+axis_direction_except_n_s_cw_ccw_opt_axis_identifier_list:
+ axis_direction_except_n_s_cw_ccw
+ | axis_direction_except_n_s_cw_ccw wkt_separator axis_direction_except_n_s_cw_ccw_opt_axis_identifier_list_options
+
+axis_direction_except_n_s_cw_ccw_opt_axis_identifier_list_options:
+ identifier opt_separator_identifier_list
+ | axis_order opt_separator_identifier_list
+
+
+
+
+opt_separator_axis_time_unit_identifier_list:
+ | wkt_separator axis_direction_except_n_s_cw_ccw_opt_axis_time_unit_identifier_list_options
+
+axis_direction_except_n_s_cw_ccw_opt_axis_time_unit_identifier_list_options:
+ identifier opt_separator_identifier_list
+ | axis_order opt_separator_identifier_list
+ | axis_order wkt_separator time_unit opt_separator_identifier_list
+ | time_unit opt_separator_identifier_list
+
+axis_direction_except_n_s_cw_ccw:
+ T_NORTHNORTHEAST
+ | T_NORTHEAST
+ | T_EASTNORTHEAST
+ | T_EAST
+ | T_EASTSOUTHEAST
+ | T_SOUTHEAST
+ | T_SOUTHSOUTHEAST
+ | T_SOUTHSOUTHWEST
+ | T_SOUTHWEST
+ | T_WESTSOUTHWEST
+ | T_WEST
+ | T_WESTNORTHWEST
+ | T_NORTHWEST
+ | T_NORTHNORTHWEST
+ | T_UP
+ | T_DOWN
+ | T_GEOCENTRICX
+ | T_GEOCENTRICY
+ | T_GEOCENTRICZ
+ | T_COLUMNPOSITIVE
+ | T_COLUMNNEGATIVE
+ | T_ROWPOSITIVE
+ | T_ROWNEGATIVE
+ | T_DISPLAYRIGHT
+ | T_DISPLAYLEFT
+ | T_DISPLAYUP
+ | T_DISPLAYDOWN
+ | T_FORWARD
+ | T_AFT
+ | T_PORT
+ | T_STARBOARD
+ | T_TOWARDS
+ | T_AWAYFROM
+ | T_FUTURE
+ | T_PAST
+ | T_UNSPECIFIED
+
+meridian: meridian_keyword left_delimiter number
+ wkt_separator angle_unit right_delimiter
+
+meridian_keyword: T_MERIDIAN
+
+bearing: bearing_keyword left_delimiter number right_delimiter
+
+bearing_keyword: T_BEARING
+
+axis_order: axis_order_keyword left_delimiter unsigned_integer right_delimiter
+
+axis_order_keyword: T_ORDER
+
+cs_unit: unit
+
+/*
+ellipsoidal_2D_coordinate_system: cs_keyword left_delimiter ellipsoidal_2D_cs_type
+ wkt_separator ellipsoidal_2D_dimension
+ opt_separator_identifier_list right_delimiter
+ separator_spatial_axis_list
+ opt_separator_cs_unit
+
+ellipsoidal_2D_cs_type: T_ELLIPSOIDAL
+
+ellipsoidal_2D_dimension: '2'
+*/
+
+// Datum ensemble
+
+datum_ensemble: geodetic_datum_ensemble_without_pm | vertical_datum_ensemble
+
+geodetic_datum_ensemble_without_pm: datum_ensemble_keyword
+ left_delimiter
+ datum_ensemble_name
+ wkt_separator datum_ensemble_member
+ datum_ensemble_member_list_ellipsoid_accuracy_identifier_list
+ right_delimiter
+
+datum_ensemble_member_list_ellipsoid_accuracy_identifier_list:
+ wkt_separator ellipsoid wkt_separator datum_ensemble_accuracy opt_separator_datum_ensemble_identifier_list
+ | wkt_separator datum_ensemble_member datum_ensemble_member_list_ellipsoid_accuracy_identifier_list
+
+opt_separator_datum_ensemble_identifier_list:
+ | wkt_separator datum_ensemble_identifier opt_separator_datum_ensemble_identifier_list
+
+vertical_datum_ensemble: datum_ensemble_keyword
+ left_delimiter
+ datum_ensemble_name
+ wkt_separator datum_ensemble_member
+ datum_ensemble_member_list_accuracy_identifier_list
+ right_delimiter
+
+datum_ensemble_member_list_accuracy_identifier_list:
+ wkt_separator datum_ensemble_accuracy opt_separator_datum_ensemble_identifier_list
+ | wkt_separator datum_ensemble_member datum_ensemble_member_list_accuracy_identifier_list
+
+datum_ensemble_keyword: T_ENSEMBLE
+
+datum_ensemble_name: quoted_latin_text
+
+datum_ensemble_member: datum_ensemble_member_keyword left_delimiter
+ datum_ensemble_member_name
+ opt_datum_ensemble_member_identifier_list
+ right_delimiter
+
+opt_datum_ensemble_member_identifier_list:
+ | wkt_separator datum_ensemble_member_identifier opt_datum_ensemble_member_identifier_list
+
+datum_ensemble_member_keyword: T_MEMBER
+
+datum_ensemble_member_name: quoted_latin_text
+
+datum_ensemble_member_identifier: identifier
+
+datum_ensemble_accuracy: datum_ensemble_accuracy_keyword left_delimiter accuracy right_delimiter
+
+datum_ensemble_accuracy_keyword: T_ENSEMBLEACCURACY
+
+accuracy: number
+
+datum_ensemble_identifier: identifier
+
+
+// Dynamic coordinate reference systems
+
+dynamic_crs: dynamic_crs_keyword left_delimiter frame_reference_epoch
+ opt_separator_deformation_model_id
+ right_delimiter
+
+dynamic_crs_keyword: T_DYNAMIC
+
+frame_reference_epoch: frame_reference_epoch_keyword left_delimiter
+ reference_epoch right_delimiter
+
+frame_reference_epoch_keyword: T_FRAMEEPOCH
+
+reference_epoch:
+ unsigned_integer
+ | unsigned_integer period
+ | unsigned_integer period unsigned_integer
+
+opt_separator_deformation_model_id:
+ | wkt_separator deformation_model_id
+
+deformation_model_id: deformation_model_id_keyword left_delimiter
+ deformation_model_name
+ opt_separator_identifier
+ right_delimiter
+
+opt_separator_identifier:
+ | wkt_separator identifier
+
+deformation_model_id_keyword: T_MODEL | T_VELOCITYGRID
+
+deformation_model_name: quoted_latin_text
+
+// Geodetic CRS
+
+geodetic_crs: static_geodetic_crs | static_geographic_crs | dynamic_geodetic_crs | dynamic_geographic_crs
+
+static_geodetic_crs: geodetic_crs_keyword
+ left_delimiter crs_name
+ wkt_separator
+ geodetic_reference_frame_or_geodetic_datum_ensemble_without_pm
+ wkt_separator
+ opt_prime_meridian_coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+static_geographic_crs: geographic_crs_keyword
+ left_delimiter crs_name
+ wkt_separator
+ geodetic_reference_frame_or_geodetic_datum_ensemble_without_pm
+ wkt_separator
+ opt_prime_meridian_coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+dynamic_geodetic_crs: geodetic_crs_keyword
+ left_delimiter crs_name
+ wkt_separator dynamic_crs
+ wkt_separator
+ geodetic_reference_frame_or_geodetic_datum_ensemble_without_pm
+ wkt_separator
+ opt_prime_meridian_coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+dynamic_geographic_crs: geographic_crs_keyword
+ left_delimiter crs_name
+ wkt_separator dynamic_crs
+ wkt_separator
+ geodetic_reference_frame_or_geodetic_datum_ensemble_without_pm
+ wkt_separator
+ opt_prime_meridian_coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+opt_prime_meridian_coordinate_system_scope_extent_identifier_remark:
+ prime_meridian wkt_separator coordinate_system_scope_extent_identifier_remark
+ | coordinate_system_scope_extent_identifier_remark
+
+crs_name: quoted_latin_text
+
+geodetic_crs_keyword: T_GEODCRS | T_GEODETICCRS
+
+geographic_crs_keyword: T_GEOGCRS | T_GEOGRAPHICCRS
+
+geodetic_reference_frame_or_geodetic_datum_ensemble_without_pm:
+ geodetic_reference_frame_without_pm
+ | geodetic_datum_ensemble_without_pm
+
+// Ellipsoid
+
+ellipsoid: ellipsoid_keyword left_delimiter ellipsoid_name
+ wkt_separator semi_major_axis
+ wkt_separator inverse_flattening
+ opt_separator_length_unit_identifier_list
+ right_delimiter
+
+opt_separator_length_unit_identifier_list:
+ | wkt_separator length_unit opt_separator_identifier_list
+ | wkt_separator identifier opt_separator_identifier_list
+
+ellipsoid_keyword: T_ELLIPSOID | T_SPHEROID
+
+ellipsoid_name: quoted_latin_text
+
+semi_major_axis: unsigned_numeric_literal
+
+inverse_flattening: unsigned_numeric_literal
+
+// Prime meridian
+
+prime_meridian: prime_meridian_keyword left_delimiter
+ prime_meridian_name wkt_separator
+ irm_longitude_opt_separator_identifier_list
+ right_delimiter
+
+prime_meridian_keyword: T_PRIMEM | T_PRIMEMERIDIAN
+
+prime_meridian_name: quoted_latin_text
+
+irm_longitude_opt_separator_identifier_list:
+ signed_numeric_literal wkt_separator angle_unit opt_separator_identifier_list
+ | signed_numeric_literal opt_separator_identifier_list
+
+// Geodetic reference frame
+
+geodetic_reference_frame_without_pm: geodetic_reference_frame_keyword
+ left_delimiter datum_name wkt_separator ellipsoid
+ opt_separator_datum_anchor_identifier_list
+ right_delimiter
+
+geodetic_reference_frame_keyword: T_DATUM | T_TRF | T_GEODETICDATUM
+
+datum_name: quoted_latin_text
+
+opt_separator_datum_anchor_identifier_list:
+ | wkt_separator datum_anchor
+ | wkt_separator identifier opt_separator_identifier_list
+ | wkt_separator datum_anchor wkt_separator identifier opt_separator_identifier_list
+
+datum_anchor: datum_anchor_keyword left_delimiter
+ datum_anchor_description right_delimiter
+
+datum_anchor_keyword: T_ANCHOR
+
+datum_anchor_description: quoted_latin_text
+
+// Projected CRS
+
+projected_crs: projected_crs_keyword left_delimiter crs_name
+ wkt_separator base_geodetic_crs
+ wkt_separator map_projection
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+projected_crs_keyword: T_PROJCRS | T_PROJECTEDCRS
+
+// Base CRS
+
+base_geodetic_crs: base_static_geodetic_crs | base_dynamic_geodetic_crs
+
+base_static_geodetic_crs: base_geodetic_crs_keyword left_delimiter base_crs_name
+ wkt_separator geodetic_reference_frame_without_pm
+ opt_separator_pm_ellipsoidal_cs_unit
+ right_delimiter
+
+opt_separator_pm_ellipsoidal_cs_unit:
+ | wkt_separator prime_meridian
+ | wkt_separator prime_meridian wkt_separator ellipsoidal_cs_unit
+ | wkt_separator ellipsoidal_cs_unit
+
+base_dynamic_geodetic_crs: base_geodetic_crs_keyword left_delimiter base_crs_name
+ wkt_separator dynamic_crs
+ wkt_separator geodetic_reference_frame_without_pm
+ opt_separator_pm_ellipsoidal_cs_unit
+ right_delimiter
+
+base_geodetic_crs_keyword: T_BASEGEODCRS | T_BASEGEOGCRS
+
+base_crs_name: quoted_latin_text
+
+ellipsoidal_cs_unit: angle_unit
+
+// Map projection
+
+map_projection: map_projection_keyword left_delimiter
+ map_projection_name
+ wkt_separator map_projection_method
+ wkt_separator
+ parameter_list_identifier_list
+ right_delimiter
+
+parameter_list_identifier_list:
+ map_projection_parameter opt_separator_identifier_list
+ | map_projection_parameter wkt_separator parameter_list_identifier_list
+
+map_projection_keyword: T_CONVERSION
+
+map_projection_name: quoted_latin_text
+
+map_projection_method: map_projection_method_keyword left_delimiter
+ map_projection_method_name
+ opt_separator_identifier_list right_delimiter
+
+map_projection_method_keyword: T_METHOD | T_PROJECTION
+
+map_projection_method_name: quoted_latin_text
+
+map_projection_parameter: parameter_keyword left_delimiter parameter_name
+ wkt_separator parameter_value
+ opt_separator_param_unit_identifier_list
+ right_delimiter
+
+opt_separator_param_unit_identifier_list:
+ | wkt_separator map_projection_parameter_unit opt_separator_identifier_list
+
+parameter_keyword: T_PARAMETER
+
+parameter_name: quoted_latin_text
+
+parameter_value: signed_numeric_literal
+
+map_projection_parameter_unit: angle_or_length_or_scale_unit
+
+// Vertical CRS
+
+vertical_crs: static_vertical_crs | dynamic_vertical_crs
+
+static_vertical_crs: vertical_crs_keyword left_delimiter crs_name
+ wkt_separator vertical_reference_frame_or_vertical_datum_ensemble
+ wkt_separator
+ vertical_cs_opt_geoid_model_id_scope_extent_identifier_remark
+ right_delimiter
+
+dynamic_vertical_crs: vertical_crs_keyword left_delimiter crs_name
+ wkt_separator dynamic_crs
+ wkt_separator vertical_reference_frame_or_vertical_datum_ensemble
+ wkt_separator
+ vertical_cs_opt_geoid_model_id_scope_extent_identifier_remark
+ right_delimiter
+
+vertical_reference_frame_or_vertical_datum_ensemble: vertical_reference_frame | vertical_datum_ensemble
+
+vertical_cs_opt_geoid_model_id_scope_extent_identifier_remark:
+ cs_keyword left_delimiter spatial_cs_type
+ wkt_separator dimension
+ opt_separator_identifier_list
+ right_delimiter
+ wkt_separator spatial_axis
+ opt_separator_cs_unit_opt_geoid_model_id_scope_extent_identifier_remark
+
+opt_separator_cs_unit_opt_geoid_model_id_scope_extent_identifier_remark:
+ | wkt_separator cs_unit opt_separator_scope_extent_identifier_remark
+ | wkt_separator cs_unit wkt_separator geoid_model_id opt_separator_scope_extent_identifier_remark
+ | wkt_separator geoid_model_id opt_separator_scope_extent_identifier_remark
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+geoid_model_id: geoid_model_keyword left_delimiter
+ geoid_model_name opt_separator_identifier
+ right_delimiter
+
+geoid_model_keyword: T_GEOIDMODEL
+
+geoid_model_name: quoted_latin_text
+
+vertical_crs_keyword: T_VERTCRS | T_VERTICALCRS
+
+// Vertical reference frame
+
+vertical_reference_frame: vertical_reference_frame_keyword left_delimiter
+ datum_name
+ opt_separator_datum_anchor_identifier_list
+ right_delimiter
+
+vertical_reference_frame_keyword: T_VDATUM | T_VRF | T_VERTICALDATUM
+
+// Engineering CRS
+
+engineering_crs: engineering_crs_keyword left_delimiter crs_name
+ wkt_separator engineering_datum
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+engineering_crs_keyword: T_ENGCRS | T_ENGINEERINGCRS
+
+engineering_datum: engineering_datum_keyword left_delimiter datum_name
+ opt_separator_datum_anchor_identifier_list
+ right_delimiter
+
+engineering_datum_keyword: T_EDATUM | T_ENGINEERINGDATUM
+
+// Parametric CRS
+
+parametric_crs: parametric_crs_keyword left_delimiter crs_name
+ wkt_separator parametric_datum
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+parametric_crs_keyword: T_PARAMETRICCRS
+
+parametric_datum: parametric_datum_keyword left_delimiter datum_name
+ opt_separator_datum_anchor_identifier_list
+ right_delimiter
+
+parametric_datum_keyword: T_PDATUM | T_PARAMETRICDATUM
+
+// Temporal CRS
+
+temporal_crs: temporal_crs_keyword left_delimiter crs_name
+ wkt_separator temporal_datum
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+temporal_crs_keyword: T_TIMECRS
+
+temporal_datum: temporal_datum_keyword left_delimiter datum_name
+ opt_separator_temporal_datum_end
+ right_delimiter
+
+opt_separator_temporal_datum_end:
+ | wkt_separator calendar opt_separator_identifier_list
+ | wkt_separator calendar wkt_separator temporal_origin opt_separator_identifier_list
+ | wkt_separator temporal_origin opt_separator_identifier_list
+ | wkt_separator identifier opt_separator_identifier_list
+
+temporal_datum_keyword: T_TDATUM | T_TIMEDATUM
+
+temporal_origin: temporal_origin_keyword left_delimiter
+ temporal_origin_description right_delimiter
+
+temporal_origin_keyword: T_TIMEORIGIN
+
+temporal_origin_description: datetime | quoted_latin_text
+
+calendar: calendar_keyword left_delimiter calendar_identifier right_delimiter
+
+calendar_keyword: T_CALENDAR
+
+calendar_identifier: quoted_latin_text
+
+// Deriving conversion
+
+deriving_conversion: deriving_conversion_keyword left_delimiter
+ deriving_conversion_name wkt_separator
+ operation_method
+ wkt_separator parameter_or_parameter_file
+ opt_separator_deriving_conversion_end
+ right_delimiter
+
+parameter_or_parameter_file: operation_parameter | operation_parameter_file
+
+opt_separator_deriving_conversion_end:
+ | wkt_separator operation_parameter opt_separator_deriving_conversion_end
+ | wkt_separator operation_parameter_file opt_separator_deriving_conversion_end
+ | wkt_separator identifier opt_separator_identifier
+
+deriving_conversion_keyword: T_DERIVINGCONVERSION
+
+deriving_conversion_name: quoted_latin_text
+
+// Derived CRS conversion method
+
+operation_method: operation_method_keyword left_delimiter
+ operation_method_name
+ opt_separator_identifier
+ right_delimiter
+
+operation_method_keyword: T_METHOD
+
+operation_method_name: quoted_latin_text
+
+// Derived CRS conversion parameter
+operation_parameter: parameter_keyword left_delimiter parameter_name
+ wkt_separator parameter_value wkt_separator parameter_unit
+ opt_separator_identifier
+ right_delimiter
+
+parameter_unit: length_or_angle_or_scale_or_time_or_parametric_unit
+
+// Approximate definition: conversion_factor should be optional only for a timeunit (but not easy to detect if UNIT keyword is used!)
+length_or_angle_or_scale_or_time_or_parametric_unit:
+ length_or_angle_or_scale_or_time_or_parametric_unit_keyword
+ left_delimiter unit_name
+ opt_separator_conversion_factor_identifier_list
+ right_delimiter
+
+length_or_angle_or_scale_or_time_or_parametric_unit_keyword:
+ T_LENGTHUNIT | T_ANGLEUNIT | T_SCALEUNIT | T_TIMEUNIT | T_PARAMETRICUNIT | T_UNIT
+
+// Derived CRS conversion parameter file
+
+operation_parameter_file: parameter_file_keyword left_delimiter parameter_name
+ wkt_separator parameter_file_name
+ opt_separator_identifier
+ right_delimiter
+
+parameter_file_keyword: T_PARAMETERFILE
+
+parameter_file_name: quoted_latin_text
+
+
+// Derived geodetic CRS and derived geographic CRS
+
+// Note: derived_geodetic_crs and derived_geographic_crs separated to avoid Bison shift/reduce conflicts
+derived_geodetic_crs: geodetic_crs_keyword
+ left_delimiter crs_name
+ wkt_separator base_geodetic_crs
+ wkt_separator deriving_conversion
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+derived_geographic_crs: geographic_crs_keyword
+ left_delimiter crs_name
+ wkt_separator base_geodetic_crs
+ wkt_separator deriving_conversion
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+
+// Derived projected CRS
+
+derived_projected_crs: derived_projected_crs_keyword left_delimiter
+ derived_crs_name wkt_separator base_projected_crs
+ wkt_separator deriving_conversion
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+derived_projected_crs_keyword: T_DERIVEDPROJCRS
+
+derived_crs_name: quoted_latin_text
+
+base_projected_crs: base_projected_crs_keyword left_delimiter base_crs_name
+ wkt_separator base_geodetic_crs
+ wkt_separator map_projection
+ right_delimiter
+
+base_projected_crs_keyword: T_BASEPROJCRS
+
+
+// Derived vertical CRS
+
+derived_vertical_crs: vertical_crs_keyword left_delimiter crs_name
+ wkt_separator base_vertical_crs
+ wkt_separator deriving_conversion
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+base_vertical_crs: base_static_vertical_crs | base_dynamic_vertical_crs
+
+base_static_vertical_crs: base_vertical_crs_keyword left_delimiter base_crs_name
+ wkt_separator vertical_reference_frame right_delimiter
+
+base_dynamic_vertical_crs: base_vertical_crs_keyword left_delimiter base_crs_name
+ wkt_separator dynamic_crs
+ wkt_separator vertical_reference_frame right_delimiter
+
+base_vertical_crs_keyword: T_BASEVERTCRS
+
+
+// Derived engineering CRS
+
+derived_engineering_crs: engineering_crs_keyword left_delimiter crs_name
+ wkt_separator base_engineering_crs
+ wkt_separator deriving_conversion
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+base_engineering_crs: base_engineering_crs_keyword left_delimiter base_crs_name
+ wkt_separator engineering_datum right_delimiter
+
+base_engineering_crs_keyword: T_BASEENGCRS
+
+
+// Derived parametric CRS
+
+derived_parametric_crs: parametric_crs_keyword left_delimiter crs_name
+ wkt_separator base_parametric_crs
+ wkt_separator deriving_conversion
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+base_parametric_crs: base_parametric_crs_keyword left_delimiter base_crs_name
+ wkt_separator parametric_datum right_delimiter
+
+base_parametric_crs_keyword: T_BASEPARAMCRS
+
+
+// Derived temporal CRS
+
+derived_temporal_crs: temporal_crs_keyword left_delimiter crs_name
+ wkt_separator base_temporal_crs
+ wkt_separator deriving_conversion
+ wkt_separator coordinate_system_scope_extent_identifier_remark
+ right_delimiter
+
+base_temporal_crs: base_temporal_crs_keyword left_delimiter base_crs_name
+ wkt_separator temporal_datum right_delimiter
+
+base_temporal_crs_keyword: T_BASETIMECRS
+
+
+// Compound CRS
+
+compound_crs: compound_crs_keyword left_delimiter compound_crs_name
+ wkt_separator horizontal_crs wkt_separator
+ compound_crs_other_components
+ right_delimiter
+
+compound_crs_other_components:
+ vertical_crs opt_separator_scope_extent_identifier_remark
+ | parametric_crs opt_separator_scope_extent_identifier_remark
+ | temporal_crs opt_separator_scope_extent_identifier_remark
+ | vertical_crs wkt_separator temporal_crs opt_separator_scope_extent_identifier_remark
+ | parametric_crs wkt_separator temporal_crs opt_separator_scope_extent_identifier_remark
+
+compound_crs_keyword: T_COMPOUNDCRS
+
+compound_crs_name: quoted_latin_text
+
+horizontal_crs: geographic2D_crs | projected_crs | engineering_crs
+
+geographic2D_crs: static_geographic_crs | dynamic_geographic_crs
+
+
+// coordinate epoch and coordinate metadata
+
+metadata_coordinate_epoch: coordinate_epoch_keyword left_delimiter
+ coordinate_epoch right_delimiter
+
+coordinate_epoch_keyword: T_EPOCH | T_COORDEPOCH
+
+coordinate_epoch:
+ unsigned_integer
+ | unsigned_integer period
+ | unsigned_integer period unsigned_integer
+
+coordinate_metadata: coordinate_metadata_keyword left_delimiter
+ coordinate_metadata_crs right_delimiter
+
+coordinate_metadata_crs:
+ static_crs
+ | dynamic_crs_coordinate_metadata wkt_separator metadata_coordinate_epoch
+
+coordinate_metadata_keyword: T_COORDINATEMETADATA
+
+static_crs: static_geodetic_crs | static_geographic_crs |
+ projected_crs | static_vertical_crs |
+ engineering_crs | parametric_crs | temporal_crs |
+ derived_geodetic_crs | derived_geographic_crs |
+ derived_projected_crs | derived_vertical_crs |
+ derived_engineering_crs | derived_parametric_crs |
+ derived_temporal_crs | compound_crs
+
+dynamic_crs_coordinate_metadata: dynamic_geodetic_crs | dynamic_geographic_crs |
+ projected_crs | dynamic_vertical_crs |
+ derived_geodetic_crs | derived_geographic_crs |
+ derived_projected_crs | derived_vertical_crs
+
+// Coordinate operations
+
+coordinate_operation: operation_keyword left_delimiter operation_name
+ wkt_separator source_crs wkt_separator target_crs
+ wkt_separator operation_method
+ wkt_separator parameter_or_parameter_file
+ opt_coordinate_operation_end
+ right_delimiter
+
+opt_coordinate_operation_end:
+ | wkt_separator operation_parameter opt_coordinate_operation_end
+ | wkt_separator operation_parameter_file opt_coordinate_operation_end
+ | wkt_separator interpolation_crs opt_separator_scope_extent_identifier_remark
+ | wkt_separator interpolation_crs wkt_separator operation_accuracy opt_separator_scope_extent_identifier_remark
+ | wkt_separator operation_accuracy opt_separator_scope_extent_identifier_remark
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+operation_keyword: T_COORDINATEOPERATION
+
+operation_name: quoted_latin_text
+
+source_crs: source_crs_keyword left_delimiter crs right_delimiter
+
+source_crs_keyword: T_SOURCECRS
+
+target_crs: target_crs_keyword left_delimiter crs right_delimiter
+
+target_crs_keyword: T_TARGETCRS
+
+interpolation_crs: interpolation_crs_keyword left_delimiter crs right_delimiter
+
+interpolation_crs_keyword: T_INTERPOLATIONCRS
+
+operation_accuracy: operation_accuracy_keyword left_delimiter accuracy right_delimiter
+
+operation_accuracy_keyword: T_OPERATIONACCURACY
+
+
+// Point motion operation
+
+point_motion_operation: point_motion_keyword left_delimiter operation_name
+ wkt_separator source_crs
+ wkt_separator operation_method
+ wkt_separator parameter_or_parameter_file
+ opt_point_motion_operation_end
+ right_delimiter
+
+opt_point_motion_operation_end:
+ | wkt_separator operation_parameter opt_point_motion_operation_end
+ | wkt_separator operation_parameter_file opt_point_motion_operation_end
+ | wkt_separator operation_accuracy opt_separator_scope_extent_identifier_remark
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+point_motion_keyword: T_POINTMOTIONOPERATION
+
+
+// Concatenated operation
+
+concatenated_operation: concatenated_operation_keyword left_delimiter
+ operation_name
+ wkt_separator source_crs wkt_separator target_crs
+ wkt_separator step_keyword left_delimiter step right_delimiter
+ wkt_separator step_keyword left_delimiter step right_delimiter
+ opt_concatenated_operation_end
+ right_delimiter
+
+step: coordinate_operation | point_motion_keyword | deriving_conversion
+
+opt_concatenated_operation_end:
+ | wkt_separator step_keyword left_delimiter step right_delimiter opt_concatenated_operation_end
+ | wkt_separator operation_accuracy opt_separator_scope_extent_identifier_remark
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+concatenated_operation_keyword: T_CONCATENATEDOPERATION
+
+step_keyword: T_STEP
+
+
+// Bound CRS
+
+bound_crs: bound_crs_keyword left_delimiter
+ source_crs wkt_separator target_crs
+ wkt_separator abridged_coordinate_transformation
+ opt_separator_scope_extent_identifier_remark
+ right_delimiter
+
+bound_crs_keyword: T_BOUNDCRS
+
+abridged_coordinate_transformation: abridged_transformation_keyword left_delimiter
+ operation_name wkt_separator
+ operation_method wkt_separator
+ abridged_parameter_or_parameter_file
+ opt_end_abridged_coordinate_transformation
+ right_delimiter
+
+abridged_parameter_or_parameter_file: abridged_transformation_parameter | operation_parameter_file
+
+opt_end_abridged_coordinate_transformation:
+ | wkt_separator abridged_transformation_parameter opt_end_abridged_coordinate_transformation
+ | wkt_separator operation_parameter_file opt_end_abridged_coordinate_transformation
+ | wkt_separator no_opt_separator_scope_extent_identifier_remark
+
+abridged_transformation_keyword: T_ABRIDGEDTRANSFORMATION
+
+abridged_transformation_parameter: parameter_keyword left_delimiter
+ parameter_name wkt_separator parameter_value
+ opt_separator_identifier_list
+ right_delimiter