// Copyright (c) 2024-2026 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.

// symbol.go
package sym

type Symbol int16

const (
	SymUnknown             Symbol = iota - 1 //  -1: Unknown symbol
	SymNone                                  //   0: Null value for variable of type symbol
	SymError                                 //   1: Error reading from stream
	SymEos                                   //   2: End of stream
	SymMinus                                 //   3: '-'
	SymMinusEqual                            //   4: '-='
	SymDoubleMinus                           //   5: '--'
	SymPlus                                  //   6: '+'
	SymPlusEqual                             //   7: '+='
	SymDoublePlus                            //   8: '++'
	SymStar                                  //   9: '*'
	SymDoubleStar                            //  10: '**'
	SymSlash                                 //  11: '/'
	SymBackSlash                             //  12: '\'
	SymVertBar                               //  13: '|'
	SymDoubleVertBar                         //  14: '||'
	SymComma                                 //  15: ','
	SymColon                                 //  16: ':'
	SymSemiColon                             //  17: ';'
	SymDot                                   //  18: '.'
	SymDotSlash                              //  19: './'
	SymQuote                                 //  20: '\''
	SymDoubleQuote                           //  21: '"'
	SymBackTick                              //  22: '`'
	SymExclamation                           //  23: '!'
	SymQuestion                              //  24: '?'
	SymAmpersand                             //  25: '&'
	SymDoubleAmpersand                       //  26: '&&'
	SymPercent                               //  27: '%'
	SymAt                                    //  28: '@'
	SymUndescore                             //  29: '_'
	SymEqual                                 //  30: '='
	SymColonEqual                            //  31: ':='
	SymDoubleEqual                           //  32: '=='
	SymLess                                  //  33: '<'
	SymLessOrEqual                           //  34: '<='
	SymGreater                               //  35: '>'
	SymGreaterOrEqual                        //  36: '>='
	SymLessGreater                           //  37: '<>'
	SymNotEqual                              //  38: '!='
	SymDollar                                //  39: '$'
	SymHash                                  //  40: '#'
	SymOpenRound                             //  41: '('
	SymClosedRound                           //  42: ')'
	SymOpenSquare                            //  43: '['
	SymClosedSquare                          //  44: ']'
	SymOpenBrace                             //  45: '{'
	SymClosedBrace                           //  46: '}'
	SymTilde                                 //  47: '~'
	SymDoubleQuestion                        //  48: '??'
	SymQuestionEqual                         //  49: '?='
	SymQuestionExclam                        //  50: '?!'
	SymDoubleAt                              //  51: '@@'
	SymDoubleColon                           //  52: '::'
	SymDoubleGreater                         //  53: '>>'
	SymDoubleLess                            //  54: '<<'
	SymCaret                                 //  55: '^'
	SymDollarRound                           //  56: '$('
	SymOpenClosedRound                       //  57: '()'
	SymDoubleDollar                          //  58: '$$'
	SymDoubleDot                             //  59: '..'
	SymTripleDot                             //  60: '...'
	SymStarEqual                             //  61: '*='
	SymSlashEqual                            //  62: '/='
	SymPercEqual                             //  63: '%='
	SymDoubleLessEqual                       //  64: '<<='
	SymDoubleGreaterEqual                    //  65: '>>='
	SymAmpersandEqual                        //  66: '&='
	SymVertBarEqual                          //  67: '|='
	SymCaretEqual                            //  68: '^='
	SymPlusGreater                           //  69: '+>'
	SymLessPlus                              //  70: '<+'
	SymChangeSign                            //  71: '-'
	SymUnchangeSign                          //  72: '+''
	SymDereference                           //  73: '*'
	SymPreInc                                //  74: '++'
	SymPreDec                                //  75: '--'
	SymIdentifier                            //  76: identifier
	SymBool                                  //  77: boolean
	SymInteger                               //  78: integer
	SymVariable                              //  79: variable
	SymFloat                                 //  80: float
	SymFraction                              //  81: fraction
	SymString                                //  82: string
	SymIterator                              //  83: iterator
	SymOr                                    //  84: 'or'
	SymAnd                                   //  85: 'and'
	SymNot                                   //  86: 'not'
	SymComment                               //  87: comment
	SymFuncCall                              //  88: function call
	SymFuncDef                               //  89: function definition
	SymList                                  //  90: list
	SymDict                                  //  91: dict
	SymIndex                                 //  92: index
	SymInterval                              //  93: range [index : index]
	SymExpression                            //  94: expression
	SymSelector                              //  95: selector <selector> ::= <expr> "?" <selector-case> {":" <selector-case>} ["::" <default-selector-case>]
	SymSelectorCase                          //  96: <selector-case> ::= [<list>] "{" <multi-expr> "}"
	SymOpenSquareLess                        //  97: '[<'
	SymGreaterClosedSquare                   //  98: '>]'
	SymLinkedList                            //  99: linked-list
	// SymOpenComment                       //   0: '/*'
	// SymClosedComment                     //   0: '*/'
	// SymOneLineComment                    //   0: '//'
	keywordBase
)
const (
	SymKwAnd = keywordBase + iota
	SymKwNot
	SymKwOr
	SymKwBut
	SymKwFunc
	SymKwBuiltin
	SymKwPlugin
	SymKwIn
	SymKwAt
	SymKwInclude
	SymKwMap
	SymKwFilter
	SymKwDigest
	SymKwCat
	SymKwGroupBy
	SymKwJoin
	SymKwNil
	SymKwUnset
)

var Keywords map[string]Symbol

func init() {
	//keywords = make(map[string]Symbol)
	Keywords = map[string]Symbol{
		"AND":     SymKwAnd,
		"BUILTIN": SymKwBuiltin,
		"PLUGIN":  SymKwPlugin,
		"BUT":     SymKwBut,
		"FUNC":    SymKwFunc,
		"IN":      SymKwIn,
		"AT":      SymKwAt,
		"INCLUDE": SymKwInclude,
		"MAP":     SymKwMap,
		"CAT":     SymKwCat,
		"FILTER":  SymKwFilter,
		"NOT":     SymKwNot,
		"OR":      SymKwOr,
		"NIL":     SymKwNil,
		"UNSET":   SymKwUnset,
		"DIGEST":  SymKwDigest,
		"JOIN":    SymKwJoin,
		"GROUPBY": SymKwGroupBy,
	}
}
