# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# LEXER GENERATOR configuration file
# ---------------------------------------
# Place *first* the generic configuration
# then list your grammar.

PACKAGE:          org.apache.asterix.runtime.operators.file.adm
LEXER_NAME:       AdmLexer

TOKENS:

BOOLEAN_CONS   = string(boolean)
INT8_CONS      = string(int8)
INT16_CONS     = string(int16)
INT32_CONS     = string(int32)
INT64_CONS     = string(int64)
INT64_CONS     = string(int)
FLOAT_CONS     = string(float)
DOUBLE_CONS    = string(double)
DATE_CONS      = string(date)
DATETIME_CONS  = string(datetime)
DURATION_CONS  = string(duration)
STRING_CONS    = string(string)
HEX_CONS       = string(hex)
BASE64_CONS    = string(base64)
POINT_CONS     = string(point)
POINT3D_CONS   = string(point3d)
LINE_CONS      = string(line)
POLYGON_CONS   = string(polygon)
RECTANGLE_CONS = string(rectangle)
CIRCLE_CONS    = string(circle)
TIME_CONS      = string(time)
INTERVAL_TIME_CONS      = string(interval-time)
INTERVAL_DATE_CONS      = string(interval-date)
INTERVAL_DATETIME_CONS  = string(interval-datetime)
YEAR_MONTH_DURATION_CONS = string(year-month-duration)
DAY_TIME_DURATION_CONS   = string(day-time-duration)
UUID_CONS      = string(uuid)

NULL_LITERAL   = string(null)
TRUE_LITERAL   = string(true)
FALSE_LITERAL  = string(false)

CONSTRUCTOR_OPEN     = char(()
CONSTRUCTOR_CLOSE    = char())
START_RECORD         = char({)
END_RECORD           = char(})
COMMA                = char(\,)
COLON                = char(:)
START_ORDERED_LIST   = char([)
END_ORDERED_LIST     = char(])
START_UNORDERED_LIST = string({{)
# END_UNORDERED_LIST  = }} is recognized as a double END_RECORD token

STRING_LITERAL       = char("), anythingUntil(")

INT_LITERAL          = signOrNothing(), digitSequence()
INT8_LITERAL         = token(INT_LITERAL), string(i8)
INT16_LITERAL        = token(INT_LITERAL), string(i16)
INT32_LITERAL        = token(INT_LITERAL), string(i32)
INT64_LITERAL        = token(INT_LITERAL), string(i64)

@EXPONENT            = caseInsensitiveChar(e), signOrNothing(), digitSequence()

DOUBLE_LITERAL		 = signOrNothing(), char(.), digitSequence()
DOUBLE_LITERAL		 = signOrNothing(), digitSequence(), char(.), digitSequence()
DOUBLE_LITERAL		 = signOrNothing(), digitSequence(), char(.), digitSequence(), token(@EXPONENT)
DOUBLE_LITERAL		 = signOrNothing(), digitSequence(), token(@EXPONENT)

FLOAT_LITERAL		 = token(DOUBLE_LITERAL), caseInsensitiveChar(f)
