// 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
CHANNEL=channel
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
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=\"([^\"\\]|\\.)*\"
NUMERIC_LITERAL=([+-]?[0-9]+(.[0-9]+)?|0x[0-9a-f]+)

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; }
  {CONST} { return CONST; }
  {ENUM} { return ENUM; }
  {INTERFACE} { return INTERFACE; }
  {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; }
  {NUMERIC_LITERAL} { return NUMERIC_LITERAL; }
  {DOC_COMMENT} { return DOC_COMMENT; }
  {LINE_COMMENT} { return LINE_COMMENT; }

[^] { return BAD_CHARACTER; }
}
