// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package fuchsia.developer.plugin.fidl;

import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.TokenType;
import static fuchsia.developer.plugin.fidl.psi.Types.*;

import static com.intellij.psi.TokenType.BAD_CHARACTER;
import static com.intellij.psi.TokenType.WHITE_SPACE;

%%

%{
  public FidlLexer() {
    this((java.io.Reader)null);
  }
%}

%public
%class FidlLexer
%implements FlexLexer
%function advance
%type IElementType
%unicode

EOL=\R
WHITE_SPACE=\s+

// Reserved words
ARRAY=array
AS=as
BITS=bits
BYTES=bytes
CHANNEL=channel
COMPOSE=compose
CONST=const
ENUM=enum
ERROR=error
EVENT=event
EVENTPAIR=eventpair
FIFO=fifo
GUEST=guest
HANDLE=handle
INTERFACE=interface
INTERRUPT=interrupt
JOB=job
LIBRARY=library
LOG=log
PORT=port
PROCESS=process
PROTOCOL=protocol
REQUEST=request
RESERVED=reserved
RESOURCE=resource
SOCKET=socket
STRING=string
STRUCT=struct
TABLE=table
THREAD=thread
TIMER=timer
UNION=union
USING_T=using
VECTOR=vector
VMAR=vmar
VMO=vmo
XUNION=xunion

// Scalar types
BOOL=bool
FLOAT32=float32
FLOAT64=float64
INT8=int8
INT16=int16
INT32=int32
INT64=int64
UINT8=uint8
UINT16=uint16
UINT32=uint32
UINT64=uint64

// Operators, etc.
OBRACE="{"
CBRACE="}"
SEMICOLON=";"
DOT="."
COMMA=","
OPAREN="("
CPAREN=")"
OBRACKET="["
CBRACKET="]"
EQUALS="="
COLON=":"
ARROW="->"
QUESTION="?"
LANGLE="<"
RANGLE=">"

// Literals
TRUE="true"
FALSE="false"
STRING_LITERAL=\"([^\"\\]|\\.)*\"
DECIMAL_FLOAT_LITERAL=[+-]?[0-9]+(\.[0-9]+)
DECIMAL_INTEGRAL_LITERAL=[+-]?[0-9]+
HEX_INTEGRAL_LITERAL=[+-]?0[Xx][0-9a-fA-F]+
BINARY_INTEGRAL_LITERAL=[+-]?0[Bb][0-1]+

IDENTIFIER=[:letter:][a-zA-Z_0-9]*
DOC_COMMENT="///".*
LINE_COMMENT="//".*

%%
<YYINITIAL> {
  {WHITE_SPACE} { return WHITE_SPACE; }

  {TRUE} { return TRUE; }
  {FALSE}  { return FALSE; }
  {LIBRARY} { return LIBRARY; }
  {USING_T} { return USING_T; }
  {AS} { return AS; }
  {BITS} { return BITS; }
  {BYTES} { return BYTES; }
  {CONST} { return CONST; }
  {ENUM} { return ENUM; }
  {INTERFACE} { return INTERFACE; }
  {PROTOCOL} { return PROTOCOL; }
  {COMPOSE} { return COMPOSE; }
  {STRUCT} { return STRUCT; }
  {TABLE} { return TABLE; }
  {UNION} { return UNION; }
  {XUNION} { return XUNION; }
  {ERROR} { return ERROR; }
  {ARRAY} { return ARRAY; }
  {VECTOR} { return VECTOR; }
  {STRING} { return STRING; }
  {HANDLE} { return HANDLE; }
  {PROCESS} { return PROCESS; }
  {THREAD} { return THREAD; }
  {VMO} { return VMO; }
  {CHANNEL} { return CHANNEL; }
  {EVENT}  { return EVENT; }
  {PORT} { return PORT; }
  {INTERRUPT} { return INTERRUPT; }
  {LOG} { return LOG; }
  {SOCKET} { return SOCKET; }
  {RESOURCE} { return RESOURCE; }
  {EVENTPAIR} { return EVENTPAIR; }
  {JOB} { return JOB; }
  {VMAR} { return VMAR; }
  {FIFO} { return FIFO; }
  {GUEST} { return GUEST; }
  {TIMER} { return TIMER; }
  {REQUEST} { return REQUEST; }
  {RESERVED} { return RESERVED; }
  {BOOL} { return BOOL; }
  {FLOAT32} { return FLOAT32; }
  {FLOAT64} { return FLOAT64; }
  {INT8} { return INT8; }
  {INT16} { return INT16; }
  {INT32} { return INT32; }
  {INT64} { return INT64; }
  {UINT8} { return UINT8; }
  {UINT16} { return UINT16; }
  {UINT32} { return UINT32; }
  {UINT64} { return UINT64; }

  {OBRACE} { return OBRACE; }
  {CBRACE} { return CBRACE; }
  {SEMICOLON} { return SEMICOLON; }
  {DOT} { return DOT; }
  {COMMA} { return COMMA; }
  {OPAREN} { return OPAREN; }
  {CPAREN} { return CPAREN; }
  {OBRACKET} { return OBRACKET; }
  {CBRACKET} { return CBRACKET; }
  {EQUALS} { return EQUALS; }
  {COLON} { return COLON; }
  {ARROW} { return ARROW; }
  {QUESTION} { return QUESTION; }
  {LANGLE} { return LANGLE; }
  {RANGLE} { return RANGLE; }
  {IDENTIFIER} { return IDENTIFIER; }
  {STRING_LITERAL} { return STRING_LITERAL; }
  {DECIMAL_FLOAT_LITERAL} { return DECIMAL_FLOAT_LITERAL; }
  {DECIMAL_INTEGRAL_LITERAL} { return DECIMAL_INTEGRAL_LITERAL; }
  {HEX_INTEGRAL_LITERAL} { return HEX_INTEGRAL_LITERAL; }
  {BINARY_INTEGRAL_LITERAL} { return BINARY_INTEGRAL_LITERAL; }
  {DOC_COMMENT} { return DOC_COMMENT; }
  {LINE_COMMENT} { return LINE_COMMENT; }

[^] { return BAD_CHARACTER; }
}
