/*
	Tcl grammar for Antlr
	few lines was generated by AntlrWorks creator
*/

lexer grammar Tcl;

VARIABLE  :
	'$'('a'..'z'|'A'..'Z'|'0'..'9'|'_'|':')* |
	'${'('a'..'z'|'A'..'Z'|'0'..'9'|'_')*'}'
    ;


INT :	('0'..'9')+
   ;

FLOAT
    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
    |   '.' ('0'..'9')+ EXPONENT?
    |   ('0'..'9')+ EXPONENT
    ;

COMMENT
    :   '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    ;

// White Space
WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;

fragment
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;

// Operators:
OPERATOR
	:
	| '?'
	| ':'
	| '<'
	| '>'
	| '/'
	| '*'
	| '-'
	| '+'
	| '.'
	| ','
	| '='
	| '{'
	| '}'
	| ';'
	| '('
	| ')'
	| '['
	| ']'
	| '!'
	| '@'
	| '#'
	| '$'
	| '%'
	| '^'
	| '&'
	| '~'
	| '|'
	| '\\'
	;



// Tcl Commands: (http://www.tcl.tk/man/tcl8.5/TclCmd/contents.htm)

TCL_COMMAND
	: 'after'
	| 'append'
	| 'apply'
	| 'array'
	| 'auto_execok'
	| 'auto_import'
	| 'auto_load'
	| 'auto_mkindex'
	| 'auto_mkindex_old'
	| 'auto_qualify'
	| 'auto_reset'
	| 'Base'
	| 'bgerror'
	| 'binary'
	| 'break'
	| 'catch'
	| 'cd'
	| 'chan'
	| 'clock'
	| 'close'
	| 'concat'
	| 'continue'
	| 'dde'
	| 'dict'
	| 'encoding'
	| 'eof'
	| 'error'
	| 'eval'
	| 'exec'
	| 'exit'
	| 'expr'
	| 'fblocked'
	| 'fconfigure'
	| 'fcopy'
	| 'file'
	| 'fileevent'
	| 'filename'
	| 'flush'
	| 'for'
	| 'foreach'
	| 'format'
	| 'gets'
	| 'glob'
	| 'global'
	| 'history'
	| 'http'
	| 'if'
	| 'incr'
	| 'info'
	| 'interp'
	| 'join'
	| 'lappend'
	| 'lassign'
	| 'lindex'
	| 'linsert'
	| 'list'
	| 'llength'
	| 'load'
	| 'lrange'
	| 'lrepeat'
	| 'lreplace'
	| 'lreverse'
	| 'lsearch'
	| 'lset'
	| 'lsort'
	| 'mathfunc'
	| 'mathop'
	| 'memory'
	| 'msgcat'
	| 'namespace'
	| 'open'
	| 'package'
	| 'parray'
	| 'pid'
	| 'pkg::create'
	| 'pkg_mkIndex'
	| 'platform'
	| 'platform::shell'
	| 'proc'
	| 'puts'
	| 'pwd'
	| 'read'
	| 'refchan'
	| 'regexp'
	| 'registry'
	| 'regsub'
	| 'rename'
	| 're_syntax'
	| 'return'
	| 'Safe'
	| 'scan'
	| 'seek'
	| 'set'
	| 'socket'
	| 'source'
	| 'split'
	| 'string'
	| 'subst'
	| 'switch'
	| 'Tcl'
	| 'tcl_endOfWord'
	| 'tcl_findLibrary'
	| 'tcl_startOfNextWord'
	| 'tcl_startOfPreviousWord'
	| 'tcltest'
	| 'tclvars'
	| 'tcl_wordBreakAfter'
	| 'tcl_wordBreakBefore'
	| 'tell'
	| 'time'
	| 'tm'
	| 'trace'
	| 'unknown'
	| 'unload'
	| 'unset'
	| 'update'
	| 'uplevel'
	| 'upvar'
	| 'variable'
	| 'vwait'
	| 'while'
	;



// Tk Commands: (http://www.tcl.tk/man/tcl8.5/TkCmd/contents.htm)

TK_COMMAND
	: 'bell'
	| 'bind'
	| 'bindtags'
	| 'bitmap'
	| 'button'
	| 'canvas'
	| 'checkbutton'
	| 'clipboard'
	| 'colors'
	| 'combobox'
	| 'console'
	| 'cursors'
	| 'destroy'
	| 'done'
	| 'entry'
	| 'event'
	| 'focus'
	| 'font'
	| 'frame'
	| 'grab'
	| 'grid'
	| 'image'
	| 'intro'
	| 'keysyms'
	| 'label'
	| 'labelframe'
	| 'listbox'
	| 'loadTk'
	| 'lower'
	| 'menu'
	| 'menubutton'
	| 'message'
	| 'notebook'
	| 'option'
	| 'options'
	| 'pack'
	| 'panedwindow'
	| 'photo'
	| 'place'
	| 'progressbar'
	| 'radiobutton'
	| 'raise'
	| 'scale'
	| 'scrollbar'
	| 'selection'
	| 'send'
	| 'separator'
	| 'sizegrip'
	| 'spinbox'
	| 'style'
	| 'text'
	| 'tk'
	| 'tk_bisque'
	| 'tk_chooseColor'
	| 'tk_chooseDirectory'
	| 'tk_dialog'
	| 'tkerror'
	| 'tk_focusFollowsMouse'
	| 'tk_focusNext'
	| 'tk_focusPrev'
	| 'tk_getOpenFile'
	| 'tk_getSaveFile'
	| 'tk_menuSetFocus'
	| 'tk_messageBox'
	| 'tk_optionMenu'
	| 'tk_popup'
	| 'tk_setPalette'
	| 'tk_textCopy'
	| 'tk_textCut'
	| 'tk_textPaste'
	| 'tkvars'
	| 'tkwait'
	| 'toplevel'
	| 'treeview'
	| 'ttk_image'
	| 'ttk_vsapi'
	| 'widget'
	| 'winfo'
	| 'wm'
	;



// itcl and itclng Commands (http://wiki.tcl.tk/351 and http://wiki.tcl.tk/19873)

ITCL_COMMAND 
	: 'addcomponent'
	| 'adddelegatedmethod'
	| 'adddelegatedoption'
	| 'addobjectoption'
	| 'addoption'
	| 'body'
	| 'cget'
	| 'chain'
	| 'class'
	| 'code'
	| 'common'
	| 'component'
	| 'componentinstall'
	| 'configbody'
	| 'configure'
	| 'createhull'
	| 'delegate'
	| 'delete'
	| 'destroy'
	| 'ensemble'
	| 'extendedclass'
	| 'filter'
	| 'find'
	| 'forward'
	| 'hullinstall'
	| 'hulltype'
	| 'info'
	| 'inherit'
	| 'installcomponent'
	| 'is'
	| 'isa'
	| 'itcl_hull'
	| 'itcl_initoptions'
	| 'itcl_options'
	| 'keepcomponentoption'
	| 'local'
	| 'method'
	| 'methodvariable'
	| 'mixin'
	| 'mymethod'
	| 'myproc'
	| 'mytypemethod'
	| 'myvar'
	| 'option'
	| 'private'
	| 'proc'
	| 'protected'
	| 'public'
	| 'scope'
	| 'setcomponent'
	| 'setupcomponent'
	| 'type'
	| 'typeconstructor'
	| 'typemethod'
	| 'variable'
	| 'widget'
	| 'widgetadaptor'
	;

ID  :	('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;
    