LCOV - code coverage report
Current view: top level - src/io - hsd_token.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 26 26
Test Date: 2026-02-04 13:26:36 Functions: 50.0 % 6 3

            Line data    Source code
       1              : !> Token definitions for the HSD lexer
       2              : !>
       3              : !> This module defines token types used during HSD parsing.
       4              : module hsd_token
       5              :   implicit none (type, external)
       6              :   private
       7              : 
       8              :   public :: hsd_token_t, token_kind
       9              :   public :: TOKEN_INVALID, TOKEN_EOF, TOKEN_WHITESPACE, TOKEN_NEWLINE
      10              :   public :: TOKEN_COMMENT, TOKEN_LBRACE, TOKEN_RBRACE, TOKEN_LBRACKET
      11              :   public :: TOKEN_RBRACKET, TOKEN_EQUAL, TOKEN_SEMICOLON, TOKEN_STRING
      12              :   public :: TOKEN_TEXT, TOKEN_INCLUDE_TXT, TOKEN_INCLUDE_HSD
      13              :   public :: token_name
      14              : 
      15              :   !> Token kind enumeration
      16              :   type :: enum_token_kind
      17              :     integer :: invalid = -1
      18              :     integer :: eof = 0
      19              :     integer :: whitespace = 1
      20              :     integer :: newline = 2
      21              :     integer :: comment = 3
      22              :     integer :: lbrace = 4      ! {
      23              :     integer :: rbrace = 5      ! }
      24              :     integer :: lbracket = 6    ! [
      25              :     integer :: rbracket = 7    ! ]
      26              :     integer :: equal = 8       ! =
      27              :     integer :: semicolon = 9   ! ;
      28              :     integer :: string = 10     ! quoted string
      29              :     integer :: text = 11       ! unquoted text/identifier
      30              :     integer :: include_txt = 12  ! <<<
      31              :     integer :: include_hsd = 13  ! <<+
      32              :   end type enum_token_kind
      33              : 
      34              :   !> Token kind constants
      35              :   type(enum_token_kind), parameter :: token_kind = enum_token_kind()
      36              : 
      37              :   !> Convenience aliases
      38              :   integer, parameter :: TOKEN_INVALID = -1
      39              :   integer, parameter :: TOKEN_EOF = 0
      40              :   integer, parameter :: TOKEN_WHITESPACE = 1
      41              :   integer, parameter :: TOKEN_NEWLINE = 2
      42              :   integer, parameter :: TOKEN_COMMENT = 3
      43              :   integer, parameter :: TOKEN_LBRACE = 4
      44              :   integer, parameter :: TOKEN_RBRACE = 5
      45              :   integer, parameter :: TOKEN_LBRACKET = 6
      46              :   integer, parameter :: TOKEN_RBRACKET = 7
      47              :   integer, parameter :: TOKEN_EQUAL = 8
      48              :   integer, parameter :: TOKEN_SEMICOLON = 9
      49              :   integer, parameter :: TOKEN_STRING = 10
      50              :   integer, parameter :: TOKEN_TEXT = 11
      51              :   integer, parameter :: TOKEN_INCLUDE_TXT = 12
      52              :   integer, parameter :: TOKEN_INCLUDE_HSD = 13
      53              : 
      54              :   !> Token type with position and value
      55              :   type :: hsd_token_t
      56              :     !> Kind of token
      57              :     integer :: kind = TOKEN_EOF
      58              :     !> Token value (for strings and text)
      59              :     character(len=:), allocatable :: value
      60              :     !> Line number where token starts
      61              :     integer :: line = 0
      62              :     !> Column number where token starts
      63              :     integer :: column = 0
      64              :   contains
      65              :     procedure :: is_eof => token_is_eof
      66              :     procedure :: is_valid => token_is_valid
      67              :   end type hsd_token_t
      68              : 
      69              : contains
      70              : 
      71              :   !> Check if token is eof
      72        56894 :   pure function token_is_eof(self) result(is_eof)
      73              :     class(hsd_token_t), intent(in) :: self
      74              :     logical :: is_eof
      75        56894 :     is_eof = self%kind == TOKEN_EOF
      76       113788 :   end function token_is_eof
      77              : 
      78              :   !> Check if token is valid (not invalid or eof)
      79            2 :   pure function token_is_valid(self) result(is_valid)
      80              :     class(hsd_token_t), intent(in) :: self
      81              :     logical :: is_valid
      82            2 :     is_valid = self%kind > TOKEN_EOF
      83        56894 :   end function token_is_valid
      84              : 
      85              :   !> Get human-readable name for a token kind
      86           16 :   pure function token_name(kind) result(name)
      87              :     integer, intent(in) :: kind
      88              :     character(len=:), allocatable :: name
      89              : 
      90           17 :     select case (kind)
      91              :     case (TOKEN_INVALID)
      92            1 :       name = "invalid"
      93              :     case (TOKEN_EOF)
      94            1 :       name = "end of file"
      95              :     case (TOKEN_WHITESPACE)
      96            1 :       name = "whitespace"
      97              :     case (TOKEN_NEWLINE)
      98            1 :       name = "newline"
      99              :     case (TOKEN_COMMENT)
     100            1 :       name = "comment"
     101              :     case (TOKEN_LBRACE)
     102            1 :       name = "opening brace"
     103              :     case (TOKEN_RBRACE)
     104            1 :       name = "closing brace"
     105              :     case (TOKEN_LBRACKET)
     106            1 :       name = "opening bracket"
     107              :     case (TOKEN_RBRACKET)
     108            1 :       name = "closing bracket"
     109              :     case (TOKEN_EQUAL)
     110            1 :       name = "equal sign"
     111              :     case (TOKEN_SEMICOLON)
     112            1 :       name = "semicolon"
     113              :     case (TOKEN_STRING)
     114            1 :       name = "string"
     115              :     case (TOKEN_TEXT)
     116            1 :       name = "text"
     117              :     case (TOKEN_INCLUDE_TXT)
     118            1 :       name = "text include"
     119              :     case (TOKEN_INCLUDE_HSD)
     120            1 :       name = "HSD include"
     121              :     case default
     122            1 :       name = "unknown"
     123              :     end select
     124              : 
     125            2 :   end function token_name
     126              : 
     127           16 : end module hsd_token
        

Generated by: LCOV version 2.0-1