# 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
EXCEPTION_SUPER_CLASS: org.apache.hyracks.api.exceptions.HyracksDataException

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_CONS  = string(interval)
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)
