23 CONSTRUCTOR Parser(
BYVAL Em 
AS EmitterIF 
PTR)
 
   24   STATIC AS LONG ToLi(...) = {0, 0, 0, 0, 0, 0}
 
   50     SELECT CASE AS CONST *Tk
 
   51     CASE MSG_ERROR, TOK_EOS :                            
RETURN Tk - t
 
   52     CASE TOK_COMMA : 
IF kl <= 0 
THEN              SKIP : 
RETURN Tk - t
 
   53     CASE TOK_BROPN, TOK_KLOPN : kl += 1
 
   54     CASE TOK_BRCLO, TOK_KLCLO : kl -= 1 : 
IF kl < 0 
THEN RETURN Tk - t
 
   73     SELECT CASE AS CONST *Tk
 
   74     CASE MSG_ERROR, TOK_EOS                         : 
RETURN Tk - t
 
   75     CASE TOK_BROPN : kl += 1
 
   76     CASE TOK_BRCLO : kl -= 1 : 
IF kl <= 0 
THEN SKIP : 
RETURN Tk - t
 
   93     IF *Tk = TOK_EOS 
THEN fl = 1 
ELSE IF fl 
THEN RETURN Tk - t
 
  115   DimTok = 0 : IniTok = 0 : BitTok = 0
 
  117   IF *Tk >= MinTk 
THEN NamTok = Tk           
ELSE NamTok = 0 : 
RETURN MSG_ERROR
 
  119     SELECT CASE AS CONST *Tk
 
  120     CASE TOK_BROPN, TOK_EQUAL
 
  121                  IF Tk > NamTok 
THEN EXIT DO ELSE NamTok = 0 : 
RETURN MSG_ERROR
 
  122     CASE  TOK_DOT : 
IF Tk[3] < MinTk         
THEN NamTok = 0 : 
RETURN MSG_ERROR
 
  123     CASE TOK_WORD : 
IF Tk[3] <> TOK_DOT 
THEN SKIP : 
EXIT DO 
  125       IF 0 = LevelCount 
ORELSE *Tk < MinTk   
THEN NamTok = 0 : 
RETURN MSG_ERROR
 
  128   LOOP : 
IF DeclMod                                       
THEN RETURN Tk - NamTok
 
  132   IF *Tk = TOK_AS 
THEN                                         RETURN Tk - NamTok
 
  134   IF *Tk = TOK_EQUAL                        
THEN IniTok = Tk : 
RETURN Tk - NamTok
 
  135   IF 0 = LevelCount 
ORELSE _
 
  136      *Tk <> TOK_EOS 
ORELSE _
 
  137      Buf[Tk[1]] <> 
ASC(
":")                               
THEN RETURN Tk - NamTok
 
  142     IF *x = TOK_EOS 
ANDALSO Buf[x[1]] <> 
ASC(
":") 
THEN _
 
  143                                         BitTok = Tk : Tk = x : 
RETURN Tk - NamTok
 
  146   SELECT CASE AS CONST *x
 
  147   CASE TOK_EQUAL : BitTok = Tk : Tk = x : IniTok = x
 
  148   CASE TOK_COMMA : BitTok = Tk : Tk = x
 
  150     FOR i 
AS INTEGER = Tk[1] + 1 
TO Tk[4] - 1
 
  151       SELECT CASE AS CONST Buf[i]
 
  152       CASE ASC(
" "), 
ASC(!
"\t"), 
ASC(!
"\v")
 
  153       CASE ASC(
"0") 
TO ASC(
"9") : BitTok = Tk : 
EXIT FOR 
  157   END SELECT : 
RETURN Tk - NamTok
 
  171   SELECT CASE AS CONST *Tk
 
  172   CASE TOK_CONS, TOK_STAT, TOK_VIRT, TOK_ABST : DivTok = Tk : SKIP
 
  173   CASE ELSE : DivTok = 0
 
  176   FunTok = Tk : DimTok = 0 : IniTok = 0 : BitTok = 0
 
  177   SELECT CASE AS CONST *Tk
 
  178   CASE TOK_CTOR, TOK_DTOR
 
  179     SKIP : 
IF *Tk = 
TOK_WORD THEN NamTok = Tk : SKIP 
ELSE NamTok = 0
 
  180     IF *Tk = TOK_EOS 
THEN RETURN TOK_EOS 
ELSE RETURN demuxTyp(1)
 
  184       IF *Tk = TOK_BROPN 
THEN EXIT DO 
  185       IF *Tk < TOK_BROPN 
THEN EXIT SELECT 
  186     LOOP UNTIL Tk >= EndTok : 
RETURN demuxTyp(1)
 
  188     SKIP : 
IF *Tk = 
TOK_WORD THEN NamTok = Tk 
ELSE EXIT SELECT 
  189     SKIP : 
IF *Tk = TOK_EOS 
THEN RETURN TOK_EOS 
ELSE RETURN demuxTyp(1)
 
  190   CASE TOK_SUB, TOK_FUNC
 
  191     SKIP : 
IF *Tk = 
TOK_WORD THEN NamTok = Tk 
ELSE EXIT SELECT 
  192     SKIP : 
IF *Tk = TOK_LIB 
THEN SKIP : 
IF *Tk = TOK_QUOTE 
THEN SKIP 
ELSE EXIT SELECT 
  193     IF *Tk = TOK_EOS 
THEN RETURN TOK_EOS 
ELSE RETURN demuxTyp(1)
 
  194   END SELECT : TypTok = 0 : FunTok = 0 : NamTok = 0 : 
RETURN MSG_ERROR
 
  227     IF *Tk = TOK_AS 
THEN As_Tok = Tk : SKIP    
ELSE RETURN MSG_ERROR
 
  229     SELECT CASE AS CONST *Tk
 
  230     CASE TOK_SUB  : FunTok = Tk
 
  231     CASE TOK_FUNC : FunTok = Tk
 
  233       IF *Tk = TOK_CONS 
THEN Co1Tok = Tk : SKIP
 
  234       IF *Tk < TOK_BYTE 
ORELSE *Tk > 
TOK_WORD THEN  RETURN MSG_ERROR
 
  235       TypTok = Tk : FunTok = 0
 
  239   SELECT CASE AS CONST *Tk
 
  241     IF FunTok 
THEN TypTok = 0                     : 
RETURN MSG_ERROR
 
  242     IniTok = Tk                                   : 
RETURN Tk - t
 
  243   CASE TOK_BROPN : 
IF 0 = FunTok               
THEN RETURN Tk - t
 
  247       IF *Tk = TOK_CONS 
THEN 
  249         IF *Tk <> TOK_PTR 
THEN TypTok = 0         : 
RETURN MSG_ERROR
 
  251         IF *Tk <> TOK_PTR 
THEN                      RETURN Tk - t
 
  254       PtrTok = Tk : 
WHILE *Tk = TOK_PTR : PtrCount += 1 : SKIP : 
WEND 
  256       IF *Tk = TOK_EQUAL 
THEN IniTok = Tk
 
  260     IF *Tk = TOK_EOS 
THEN RETURN IIF(*FunTok = TOK_FUNC, MSG_ERROR, TOK_EOS)
 
  262     SELECT CASE AS CONST *Tk
 
  263     CASE TOK_CDEC, TOK_STCL, TOK_PASC : CalTok = Tk : SKIP
 
  266     IF *Tk = TOK_OVER 
THEN SKIP
 
  267     IF *Tk = TOK_ALIA 
THEN 
  269       SKIP : 
IF *Tk <> TOK_QUOTE 
THEN TypTok = 0  : 
RETURN MSG_ERROR
 
  278     IF *Tk = TOK_CONS 
THEN Co1Tok = Tk : SKIP
 
  280     IF *Tk = TOK_CONS 
THEN 
  282       IF *Tk <> TOK_PTR 
THEN FunTok = 0: TypTok = 0 : 
RETURN MSG_ERROR
 
  284     PtrTok = Tk : 
WHILE *Tk = TOK_PTR : PtrCount += 1 : SKIP : 
WEND 
  286     IF *FunTok = TOK_FUNC 
THEN RETURN MSG_ERROR
 
  289   IF *Tk = TOK_STAT 
THEN 
  290     SKIP : 
IF *Tk = TOK_EXPO 
THEN SKIP
 
  292     IF *Tk = TOK_EXPO 
THEN SKIP : 
IF *Tk = TOK_STAT 
THEN SKIP
 
  293   END IF : 
RETURN Tk - t
 
  307   TypTok = 0 : FunTok = 0
 
  311     skipOverComma() : ListCount = count : Export_(@
THIS) : count += 1
 
  312   LOOP UNTIL *Tk <= TOK_COMMA
 
  330     skipOverComma() : ListCount = count : Export_(@
THIS) : count += 1
 
  331   LOOP UNTIL *Tk <= TOK_COMMA
 
  345   TypTok = 0 : FunTok = 0 : LevelCount += 1
 
  348     SELECT CASE AS CONST *Tk
 
  350       SKIP : 
IF *Tk = TOK_ENUM 
THEN EXIT WHILE 
  351       Errr(
"END ENUM expected") : 
EXIT WHILE 
  372   VAR in_tk1 = 
iif(LevelCount, *Tk1, *StaTok)
 
  377     SELECT CASE AS CONST nextok
 
  378     CASE TOK_AS, TOK_BROPN
 
  380       SELECT CASE AS CONST *Tk1
 
  381       CASE TOK_DIM, TOK_RDIM : SKIP
 
  383           IF Errr(
"type expected1") = MSG_ERROR 
THEN CONTINUE DO _
 
  385         IF MSG_ERROR >= 
demuxNam(TOK_ABST) 
THEN _
 
  386           IF Errr(
"name expected1") = MSG_ERROR 
THEN CONTINUE DO _
 
  389         *NamTok = 
TOK_WORD : ListCount = 0 : Export_(@
THIS)
 
  392         IF MSG_ERROR >= 
demuxNam(TOK_ABST) 
THEN _
 
  393           IF Errr(
"name expected") = MSG_ERROR 
THEN CONTINUE DO _
 
  396           IF Errr(
"type expected") = MSG_ERROR 
THEN CONTINUE DO _
 
  399         *NamTok = 
TOK_WORD : ListCount = 0 : Export_(@
THIS)
 
  404       SELECT CASE AS CONST *Tk1
 
  406       CASE TOK_DIM, TOK_RDIM : SKIP
 
  407         IF MSG_ERROR >= 
demuxNam(TOK_ABST) 
THEN _
 
  408           IF Errr(
"name expected") = MSG_ERROR 
THEN CONTINUE DO _
 
  410         IF *Tk <> TOK_AS 
THEN _
 
  411           IF Errr(
"'AS' expected->" & 
SubStr(Tk) & 
"<-") = MSG_ERROR 
THEN CONTINUE DO _
 
  414           IF Errr(
"type expected") = MSG_ERROR 
THEN CONTINUE DO _
 
  417         *NamTok = 
TOK_WORD : ListCount = 0 : Export_(@
THIS)
 
  423           IF Errr(
"type expected") = MSG_ERROR 
THEN CONTINUE DO _
 
  425         IF MSG_ERROR >= 
demuxNam(TOK_ABST) 
THEN _
 
  426           IF Errr(
"name expected") = MSG_ERROR 
THEN CONTINUE DO _
 
  429         *NamTok = 
TOK_WORD : ListCount = 0 : Export_(@
THIS)
 
  433         IF nextok = in_tk1                     
THEN EXIT DO 
  434         IF Errr(
"not supported") < MSG_ERROR   
THEN EXIT DO 
  442       CASE TOK_PUBL, TOK_PRIV, TOK_PROT
 
  445       CASE TOK_ENUM, TOK_TYPE, TOK_UNIO, TOK_CLAS
 
  447         IF nextok = 
TOK_WORD THEN SKIP : BlockNam = 
SubStr ELSE BlockNam = 
"" 
  466   VAR count = 0, t = Tk
 
  472     SELECT CASE AS CONST *Tk
 
  473     CASE TOK_BRCLO : 
IF count > 0 
THEN Errr(
"parameter expected")
 
  474       ListCount = count : 
EXIT DO 
  475     CASE TOK_3DOT : NamTok = Tk : TypTok = 0 : FunTok = 0
 
  477       IF *Tk = TOK_BYVA 
ORELSE *Tk = TOK_BYRE 
THEN By_Tok = Tk : SKIP
 
  478       IF *Tk <> TOK_AS 
ANDALSO *Tk >= TOK_ABST 
THEN 
  486     skipOverComma() : count += 1 : ListCount = count : Export_(@
THIS)
 
  487   LOOP UNTIL *Tk < TOK_COMMA : By_Tok = 0 : Tk = t
 
  506   IF 3 > 
tokenize(TO_COLON)               
THEN RETURN Errr(
"syntax error")
 
  508   DimTok = 0 : IniTok = 0 : BitTok = 0
 
  509   IF *StaTok = TOK_TYPE 
THEN 
  511       IF MSG_ERROR >= 
demuxTyp()          
THEN RETURN Errr(
"type expected")
 
  512       IF *Tk = 
TOK_WORD THEN NamTok = Tk  
ELSE RETURN Errr(
"name expected")
 
  514       IF Emit->Decl_ 
THEN Emit->Decl_(@
THIS)                     :
 
  517       IF *Tk = 
TOK_WORD THEN NamTok = Tk : SKIP 
ELSE RETURN Errr(
"name expected")
 
  519         IF MSG_ERROR >= 
demuxTyp()        
THEN RETURN Errr(
"type expected")
 
  521         IF Emit->Decl_ 
THEN Emit->Decl_(@
THIS)                     :
 
  526     IF *Tk = 
TOK_WORD THEN NamTok = Tk    
ELSE RETURN Errr(
"name expected")
 
  528   IF 0 = 
Emit->Clas_                      
THEN RETURN MSG_ERROR
 
  530   IF 9 > 
tokenize(TO_END_BLOCK)           
THEN RETURN Errr(
"syntax error")
 
  531   Emit->Clas_(@
THIS) :                         
RETURN MSG_ERROR
 
  545          RETURN IIF(*StaTok = TOK_EXRN, MSG_ERROR, 
Errr(
"syntax error"))
 
  546   IF *Tk <> TOK_PRES 
THEN DivTok = 0 
ELSE DivTok = Tk : SKIP
 
  547   IF *Tk <> TOK_SHAR 
THEN ShaTok = 0 
ELSE ShaTok = Tk : SKIP
 
  550     IF MSG_ERROR >= 
demuxTyp() 
THEN RETURN Errr(
"type expected")
 
  551     IF MSG_ERROR >= 
demuxNam() 
THEN RETURN Errr(
"name expected")
 
  553     IF *StaTok = TOK_EXRN 
THEN      RETURN MSG_ERROR
 
  554     IF MSG_ERROR >= 
demuxNam() 
THEN RETURN Errr(
"name expected")
 
  555     IF *Tk = TOK_AS 
THEN demuxTyp() 
ELSE TypTok = 0 : FunTok = 0
 
  556     IF 0 = TypTok 
ANDALSO 0 = FunTok 
THEN 
  557       SELECT CASE AS CONST *StaTok
 
  558       CASE TOK_VAR, TOK_CONS
 
  559         IF  0 = IniTok 
THEN         RETURN Errr(
"initialization expected")
 
  560       CASE ELSE                   : 
RETURN Errr(
"type expected")
 
  567   IF *Tk <= TOK_EOS 
THEN RETURN MSG_ERROR
 
  583   IF 9 > 
tokenize(TO_END_BLOCK)         
THEN RETURN Errr(
"syntax error")
 
  584   IF *Tk = 
TOK_WORD THEN BlockNam = 
SubStr : SKIP 
ELSE BlockNam = 
"" 
  601   IF 9 > 
tokenize(TO_END_BLOCK)         
THEN RETURN Errr(
"syntax error")
 
  621   SELECT CASE AS CONST ToLast
 
  622   CASE TOK_PUBL, TOK_PRIV, TOK_ABST, TOK_VIRT : DivTok = StaTok
 
  623   CASE ELSE : DivTok = 0
 
  625   IF 9 > 
tokenize(TO_END_BLOCK)         
THEN RETURN Errr(
"syntax error")
 
  628   IF DivTok 
THEN DivTok = Tk1
 
  630   IF MSG_ERROR >= 
demuxTyp(1)           
THEN RETURN Errr(
"syntax error")
 
  632   FOR i 
AS INTEGER = 0 
TO 1 
  633     SELECT CASE AS CONST *Tk
 
  654   IF 3 > 
tokenize(TO_COLON)   
THEN RETURN Errr(
"syntax error")
 
  671   IF 3 > 
tokenize(TO_EOL) 
THEN RETURN Errr(
"syntax error")
 
  672   IF *Tk = TOK_ONCE 
THEN DivTok = Tk : SKIP 
ELSE DivTok = 0
 
  673   IF *Tk <> TOK_QUOTE     
THEN RETURN Errr(
"file name expected")
 
  687   IF 3 > 
tokenize(TO_END_BLOCK) 
THEN RETURN Errr(
"syntax error")
 
  690   IF *Tk <> TOK_BROPN           
THEN RETURN Errr(
"'()' expected")
 
  706   IF 3 > 
tokenize(TO_EOL) 
THEN RETURN Errr(
"syntax error")
 
  709   IF *Tk = TOK_BROPN 
ANDALSO Tk[1] = NamTok[1] + NamTok[2] _
 
  730     FOR i 
AS INTEGER = Tk[1] 
TO EndTok[1]
 
  731       IF Buf[i] = 
ASC(!
"\n") 
THEN z -= 1
 
  734   ErrMsg = 
"-error(" & z & 
"): " & E & 
", found '" & 
SubStr(Tk) & 
"' " 
  736   SELECT CASE AS CONST *StaTok
 
  737   CASE TOK_DIM  : ErrMsg &= 
"(DIM)" 
  738   CASE TOK_RDIM : ErrMsg &= 
"(REDIM)" 
  739   CASE TOK_VAR  : ErrMsg &= 
"(VAR)" 
  740   CASE TOK_CONS : ErrMsg &= 
"(CONST)" 
  741   CASE TOK_STAT : ErrMsg &= 
"(STATIC)" 
  742   CASE TOK_COMM : ErrMsg &= 
"(COMMON)" 
  743   CASE TOK_EXRN : ErrMsg &= 
"(EXTERN)" 
  744   CASE TOK_TYPE : ErrMsg &= 
"(TYPE)" 
  745   CASE TOK_CLAS : ErrMsg &= 
"(CLASS)" 
  746   CASE TOK_SUB  : ErrMsg &= 
"(SUB)" 
  747   CASE TOK_FUNC : ErrMsg &= 
"(FUNCTION)" 
  748   CASE TOK_PROP : ErrMsg &= 
"(PROPERTY)" 
  749   CASE TOK_CTOR : ErrMsg &= 
"(CONSTRUCTOR)" 
  750   CASE TOK_DTOR : ErrMsg &= 
"(DESTRUCTOR)" 
  751   CASE TOK_NAMS : ErrMsg &= 
"(NAMESPACE)" 
  752   CASE TOK_SCOP : ErrMsg &= 
"(SCOPE)" 
  753   CASE TOK_ENUM : ErrMsg &= 
"(ENUM)" 
  754   CASE TOK_UNIO : ErrMsg &= 
"(UNION)" 
  755   CASE TOK_DECL : ErrMsg &= 
"(DECLARE)" 
  756   CASE TOK_DEFI : ErrMsg &= 
"(#DEFINE)" 
  757   CASE TOK_MACR : ErrMsg &= 
"(#MACRO)" 
  758   CASE ELSE     : ErrMsg &= 
"(???)" 
  760   IF Emit->Error_ 
THEN Emit->Error_(@
THIS)
 
  763   RETURN IIF(Buf[Po] = 0, MSG_STOP, MSG_ERROR)
 
  776   SELECT CASE AS CONST Buf[*A]
 
  777   CASE ASC(
"A"), 
ASC(
"a")
 
  779     CASE "AS" : 
RETURN TOK_AS
 
  780     CASE "ALIAS" : 
RETURN TOK_ALIA
 
  781     CASE "ANY" : 
RETURN TOK_ANY
 
  782     CASE "ABSTRACT" : 
RETURN TOK_ABST
 
  784   CASE ASC(
"B"), 
ASC(
"b")
 
  786     CASE "BYTE" : 
RETURN TOK_BYTE
 
  787     CASE "BYREF" : 
RETURN TOK_BYRE
 
  788     CASE "BYVAL" : 
RETURN TOK_BYVA
 
  790   CASE ASC(
"C"), 
ASC(
"c")
 
  792     CASE "CAST" : 
RETURN TOK_CAST
 
  793     CASE "CDECL" : 
RETURN TOK_CDEC
 
  794     CASE "CLASS" : 
RETURN TOK_CLAS
 
  795     CASE "CONST" : 
RETURN TOK_CONS
 
  796     CASE "COMMON" : 
RETURN TOK_COMM
 
  797     CASE "CONSTRUCTOR" : 
RETURN TOK_CTOR
 
  799   CASE ASC(
"D"), 
ASC(
"d")
 
  801     CASE "DIM" : 
RETURN TOK_DIM
 
  802     CASE "DOUBLE" : 
RETURN TOK_DOUB
 
  803     CASE "DEFINE" : 
IF ToLast = TOK_LATTE 
THEN RETURN TOK_DEFI
 
  804     CASE "DECLARE" : 
RETURN TOK_DECL
 
  805     CASE "DESTRUCTOR" : 
RETURN TOK_DTOR
 
  807   CASE ASC(
"E"), 
ASC(
"e")
 
  809     CASE "END" : 
RETURN TOK_END
 
  810     CASE "ENUM" : 
RETURN TOK_ENUM
 
  811     CASE "EXTERN" : 
RETURN TOK_EXRN
 
  812     CASE "EXPORT" : 
RETURN TOK_EXPO
 
  813     CASE "EXTENDS" : 
RETURN TOK_EXDS
 
  814     CASE "ENDMACRO" : 
IF ToLast = TOK_LATTE 
THEN RETURN TOK_EMAC
 
  816   CASE ASC(
"F"), 
ASC(
"f")
 
  818     CASE "FUNCTION" :  
RETURN TOK_FUNC
 
  819     CASE "FIELD" : 
RETURN TOK_FILD
 
  821   CASE ASC(
"I"), 
ASC(
"i")
 
  823     CASE "INCLUDE" : 
IF ToLast = TOK_LATTE 
THEN RETURN TOK_INCL
 
  824     CASE "INTEGER" : 
RETURN TOK_INT
 
  826   CASE ASC(
"L"), 
ASC(
"l")
 
  828     CASE "LIB" : 
RETURN TOK_LIB
 
  829     CASE "LONG" : 
RETURN TOK_LONG
 
  830     CASE "LONGINT" : 
RETURN TOK_LINT
 
  832   CASE ASC(
"M"), 
ASC(
"m") : 
IF USubStr() = 
"MACRO" THEN IF ToLast = TOK_LATTE 
THEN RETURN TOK_MACR
 
  833   CASE ASC(
"N"), 
ASC(
"n") : 
IF USubStr() = 
"NAMESPACE" THEN RETURN TOK_NAMS
 
  834   CASE ASC(
"O"), 
ASC(
"o")
 
  836     CASE "ONCE" : 
RETURN TOK_ONCE
 
  837     CASE "OPERATOR" : 
RETURN TOK_OPER
 
  838     CASE "OVERLOAD" : 
RETURN TOK_OVER
 
  840   CASE ASC(
"P"), 
ASC(
"p")
 
  842     CASE "PTR" : 
RETURN TOK_PTR
 
  843     CASE "PEEK" : 
RETURN TOK_PEEK
 
  844     CASE "POINTER" : 
RETURN TOK_PTR
 
  845     CASE "PRESERVE" : 
RETURN TOK_PRES
 
  846     CASE "PROPERTY" : 
RETURN TOK_PROP
 
  847     CASE "PUBLIC" : 
RETURN TOK_PUBL
 
  848     CASE "PRIVATE" : 
RETURN TOK_PRIV
 
  849     CASE "PROTECTED" : 
RETURN TOK_PROT
 
  850     CASE "PASCAL" : 
RETURN TOK_PASC
 
  852   CASE ASC(
"R"), 
ASC(
"r") : 
IF USubStr() = 
"REDIM" THEN RETURN TOK_RDIM
 
  853   CASE ASC(
"S"), 
ASC(
"s")
 
  855     CASE "SUB" : 
RETURN TOK_SUB
 
  856     CASE "SCOPE" : 
RETURN TOK_SCOP
 
  857     CASE "SHORT" : 
RETURN TOK_SHOR
 
  858     CASE "SINGLE" : 
RETURN TOK_SING
 
  859     CASE "SHARED" : 
RETURN TOK_SHAR
 
  860     CASE "STRING" : 
RETURN TOK_STRI
 
  861     CASE "STATIC" : 
RETURN TOK_STAT
 
  862     CASE "STDCALL" : 
RETURN TOK_STCL
 
  864   CASE ASC(
"T"), 
ASC(
"t") : 
IF USubStr() = 
"TYPE" THEN RETURN TOK_TYPE
 
  865   CASE ASC(
"U"), 
ASC(
"u")
 
  867     CASE "UNION" : 
RETURN TOK_UNIO
 
  868     CASE "UBYTE" : 
RETURN TOK_UBYT
 
  869     CASE "ULONG" : 
RETURN TOK_ULNG
 
  870     CASE "ULONGINT" : 
RETURN TOK_ULIN
 
  871     CASE "UINTEGER" : 
RETURN TOK_UINT
 
  872     CASE "USHORT" : 
RETURN TOK_USHO
 
  874   CASE ASC(
"V"), 
ASC(
"v")
 
  876     CASE "VAR" : 
RETURN TOK_VAR
 
  877     CASE "VIRTUAL" : 
RETURN TOK_VIRT
 
  879   CASE ASC(
"W"), 
ASC(
"w")
 
  881     CASE "WITH" : 
RETURN TOK_WITH
 
  882     CASE "WSTRING" : 
RETURN TOK_WSTR
 
  884   CASE ASC(
"Z"), 
ASC(
"z") : 
IF USubStr() = 
"ZSTRING" THEN RETURN TOK_ZSTR
 
  896 #MACRO SCAN_ML_COMM()
 
  899     SELECT CASE AS CONST Buf[Po]
 
  901     CASE ASC(!
"\n") : LineNo += 1
 
  903       SELECT CASE AS CONST Buf[Po + 1]
 
  905       CASE ASC(
"/") : Po += 1 : 
EXIT DO 
  922     SELECT CASE AS CONST Buf[Po]
 
  923     CASE ASC(
"0") 
TO ASC(
"9"), _
 
  924          ASC(
"A") 
TO ASC(
"Z"), _
 
  925          ASC(
"a") 
TO ASC(
"z"), 
ASC(
"_") : Po += 1
 
  932 #DEFINE SETOK(_T_,_A_,_L_) Tok &= 
MKL(_T_) & 
MKL(_A_) & 
MKL(_L_) : ToLast = _T_
 
  935 #DEFINE EXIT_STOP  SETOK(MSG_STOP, Po, 1) : Po -= 1 : 
EXIT DO 
  951   VAR coca = 0, endcount = 0, newblock = 0 
 
  952   VAR tok_begin = 
LEN(Tok) 
SHR 2 
  953   ToLast = 
IIF(*StaTok = TOK_TYPE, TOK_EOS, MSG_ERROR)
 
  956     SELECT CASE AS CONST Buf[Po]
 
  958     CASE ASC(!
"\n") : LineNo += 1 : 
IF coca 
THEN coca = 0 : 
EXIT SELECT 
  959       IF ToLast = TOK_EOS 
THEN EXIT SELECT 
  960       SETOK(TOK_EOS, Po, 1) : 
IF Stop_ >= TO_EOL       
THEN EXIT DO 
  961       IF newblock 
THEN endcount += 1 : newblock = 0
 
  963       SETOK(TOK_EOS, Po, 1)   : 
IF Stop_ >= TO_COLON   
THEN EXIT DO 
  964       IF newblock 
THEN endcount += 1 : newblock = 0
 
  965     CASE   ASC(
",") : SETOK(TOK_COMMA, Po, 1)
 
  966     CASE   ASC(
"-") : 
IF Buf[Po + 1] <> 
ASC(
">")       
THEN EXIT SELECT 
  967       SETOK(TOK_MEOP, Po, 2)         : Po += 2       : 
CONTINUE DO 
  969       IF Buf[Po + 1] = 
ASC(
".") 
ANDALSO _
 
  970          Buf[Po + 2] = 
ASC(
".") 
ANDALSO _
 
  971          Buf[Po + 3] <> 
ASC(
".") _
 
  972            THEN SETOK(TOK_3DOT, Po, 3) : Po += 3     : 
CONTINUE DO 
  973       SETOK(TOK_DOT, Po, 1)
 
  974     CASE   ASC(
"=") : SETOK(TOK_EQUAL, Po, 1)
 
  975     CASE   ASC(
"{"), 
ASC(
"[") : SETOK(TOK_KLOPN, Po, 1)
 
  976     CASE   ASC(
"}"), 
ASC(
"]") : SETOK(TOK_KLCLO, Po, 1)
 
  977     CASE   ASC(
"(")           : SETOK(TOK_BROPN, Po, 1)
 
  978     CASE   ASC(
")")           : SETOK(TOK_BRCLO, Po, 1)
 
  979     CASE   ASC(
"#") : SETOK(TOK_LATTE, Po, 1)
 
  981     CASE ASC(
"A") 
TO ASC(
"Z"), 
ASC(
"a") 
TO ASC(
"z"), 
ASC(
"_")
 
  983       *L = Po - *A : 
IF *L = 1 
ANDALSO Buf[*A] = 
ASC(
"_") 
THEN coca = *A : 
CONTINUE DO 
  988       IF pretok = TOK_END 
THEN 
  989         SELECT CASE AS CONST *StaTok
 
  990         CASE TOK_SUB, TOK_FUNC, TOK_PROP, TOK_OPER, TOK_CTOR, TOK_DTOR, TOK_ENUM
 
  991           IF ToLast = *StaTok 
THEN Stop_ = TO_COLON
 
  993         CASE TOK_UNIO, TOK_TYPE, TOK_CLAS
 
  994           IF ToLast <> *StaTok 
THEN CONTINUE DO 
  995         CASE ELSE : 
CONTINUE DO 
  997         endcount -= 1 : 
IF endcount < 0 
THEN Stop_ = TO_COLON
 
  999         SELECT CASE AS CONST *StaTok
 
 1000         CASE TOK_UNIO, TOK_TYPE, TOK_CLAS
 
 1001           IF pretok <> TOK_EOS 
THEN CONTINUE DO 
 1002           IF ToLast = *StaTok 
THEN newblock = 1
 
 1003         CASE TOK_MACR : 
IF ToLast = TOK_EMAC 
THEN Stop_ = TO_COLON
 
 1005       END IF : 
CONTINUE DO 
 1010       SETOK(TOK_QUOTE, *A, Po - *A + 1)
 
 1011       IF Buf[Po] <> 
ASC(
"""") 
THEN EXIT_STOP
 
 1013       SCAN_SL_COMM(Buf,Po)
 
 1015     CASE ASC(
"/") : 
IF Buf[Po + 1] <> 
ASC(
"'") 
THEN   EXIT SELECT 
 1017       IF Buf[Po] <> 
ASC(
"/") 
THEN EXIT_STOP
 
 1018     END SELECT : Po += 1
 
 1019   LOOP : A -= 3 : L -= 3 : Po += 1
 
 1021   Tk1 = 
CAST(
LONG PTR, 
SADD(Tok))
 
 1022   EndTok = Tk1 + (
LEN(Tok) 
SHR 2) - 3
 
 1023   Tk = Tk1 + tok_begin
 
 1041   IF Emit->Init_ 
THEN Emit->Init_(@
THIS)
 
 1043     SELECT CASE AS CONST Buf[Po] 
 
 1045     CASE ASC(!
"\n") : *L = 0 : LineNo += 1
 
 1046     CASE   ASC(
":") : *L = 0 : ToLast = 0
 
 1047     CASE   ASC(
"#") : ToLast = TOK_LATTE
 
 1050       ToLast = TOK_QUOTE : 
IF Buf[Po] <> 
ASC(
"""") 
THEN EXIT DO 
 1052       SCAN_SL_COMM(Buf,Po)
 
 1054     CASE ASC(
"/") : 
IF Buf[Po + 1] <> 
ASC(
"'") 
THEN EXIT SELECT 
 1056       IF Buf[Po] <> 
ASC(!
"/") 
THEN EXIT DO 
 1058     CASE ASC(
"_"), 
ASC(
"A") 
TO ASC(
"Z"), 
ASC(
"a") 
TO ASC(
"z")
 
 1059       SCAN_WORD() :  
IF *L 
THEN ToLast = 0 : 
CONTINUE DO  
 1060       *L = Po - *A : 
IF *L = 1 
ANDALSO Buf[*A] = 
ASC(
"_") 
THEN ToLast = 0 : *L = 0 : 
CONTINUE DO 
 1065       SELECT CASE AS CONST *StaTok
 
 1066       CASE TOK_SUB, TOK_FUNC, TOK_PROP, TOK_OPER, TOK_CTOR, TOK_DTOR
 
 1068       CASE TOK_DIM, TOK_RDIM, TOK_VAR, TOK_CONS, TOK_COMM, TOK_EXRN, TOK_EXPO, TOK_STAT
 
 1069                       IF Emit->Decl_ 
ANDALSO      VAR_() = MSG_STOP 
THEN EXIT DO 
 1070       CASE TOK_TYPE, TOK_CLAS
 
 1071                       IF                         TYPE_() = MSG_STOP 
THEN EXIT DO 
 1072       CASE TOK_UNIO : 
IF Emit->Unio_ 
ANDALSO    UNION_() = MSG_STOP 
THEN EXIT DO 
 1073       CASE TOK_ENUM : 
IF Emit->
Enum_ ANDALSO     ENUM_() = MSG_STOP 
THEN EXIT DO 
 1075         IF 0 = 
Emit->Decl_ 
THEN ToLast = *StaTok : Tok = 
"" : 
CONTINUE DO 
 1076         IF                                    DECLARE_() = MSG_STOP 
THEN EXIT DO 
 1077       CASE TOK_DEFI : 
IF Emit->Defi_ 
ANDALSO   DEFINE_() = MSG_STOP 
THEN EXIT DO 
 1078       CASE TOK_MACR : 
IF Emit->Defi_ 
ANDALSO    MACRO_() = MSG_STOP 
THEN EXIT DO 
 1079       CASE TOK_INCL : 
IF Emit->Incl_ 
ANDALSO  INCLUDE_() = MSG_STOP 
THEN EXIT DO 
 1080       CASE TOK_PUBL, TOK_PRIV, TOK_ABST, TOK_VIRT
 
 1081         SETOK(*StaTok, *A, *L) : *L = 0 : 
CONTINUE DO 
 1084       CASE ELSE :  ToLast = *StaTok : 
CONTINUE DO 
 1085       END SELECT : ToLast = *StaTok : Tok = 
"" : *L = 0 : 
CONTINUE DO 
 1086     END SELECT : Po += 1
 
 1087   LOOP : 
IF Emit->Exit_ 
THEN Emit->Exit_(@
THIS)
 
 1101 SUB Parser.File_(
BYREF File 
AS STRING, 
BYVAL Tree 
AS INTEGER)
 
 1103   IF OPEN(File 
FOR INPUT AS #fnr) _
 
 1104     THEN ErrMsg = 
"couldn't read file """ & File & 
""" " &_
 
 1105                   "(ERR = " & 
ERR & 
"), currdir=" & 
CURDIR : 
EXIT SUB 
 1106   Buf = 
STRING(
LOF(fnr), 0)
 
 1112   IF OPT->InTree 
THEN InPath = 
LEFT(File, 
INSTRREV(File, SLASH))
 
 1130   OPEN CONS FOR INPUT AS #fnr
 
 1138   IF LEN(Buf) < 3 
THEN 
 1139     IF Emit->Empty_ 
THEN Emit->Empty_(@
THIS)
 
 1146   Code(  
"'                   " & PROJ_NAME & 
": no --geany-mode output:" & _
 
 1147     NL & 
"'                        select either a line" & _
 
 1148     NL & 
"'         DIM, COMMON, CONST, EXTERN, STATIC, DECLARE, #DEFINE" & _
 
 1149     NL & 
"'                              or a block" & _
 
 1150     NL & 
"'                       ENUM, UNION, TYPE, #MACRO" & _
 
 1152     NL & 
"'                      SUB, FUNCTION or PROPERTY" & _
 
 1153     NL & 
"'                            declaration or" & _
 
 1154     NL & 
"'                   place the cursor in an empty line" & _
 
 1193   VAR a = BitTok[1] + 1, l = 0
 
 1194   FOR i 
AS INTEGER = a 
TO BitTok[4] - 1
 
 1195     SELECT CASE AS CONST Buf[i]
 
 1196     CASE ASC(
" "), 
ASC(!
"\t"), 
ASC(!
"\v") : 
IF l 
THEN EXIT FOR 
 1197     CASE ASC(
"0") 
TO ASC(
"9") : 
IF l 
THEN l += 1 
ELSE a = i : l = 1
 
 1198     CASE ELSE : 
EXIT FOR 
 1200   NEXT : 
RETURN ": " & 
MID(Buf, a + 1, l)
 
 1211   IF 0 = Tk 
THEN RETURN " ?? 0 ?? " 
 1212   RETURN MID(Buf, Tk[1] + 1, Tk[2])
 
 1223 PROPERTY Parser.SubStr(
BYVAL T 
AS LONG PTR) 
AS STRING EXPORT 
 1224   IF 0 = T 
THEN RETURN " ?? 0 ?? " 
 1225   RETURN MID(Buf, T[1] + 1, T[2])
 
 1237   RETURN UCASE(
MID(Buf, *A + 1, Po - *A))
 
 1254     IF .RunMode = .GEANY_MODE 
THEN EXIT SUB 
 1256     VAR i = 
INSTRREV(N, SLASH)
 
 1257     VAR fnam = .
addPath(InPath, 
LEFT(N, i)) & 
MID(N, i + 1)
 
 1259     IF DivTok 
ANDALSO INSTR(.FileIncl, !
"\n" & fnam & !
"\r") 
THEN _
 
 1261       MSG_CONT(
"skipped (already done)") : 
EXIT SUB 
 1264     IF OPEN(fnam 
FOR INPUT AS #fnr) 
THEN _
 
 1266       MSG_CONT(
"skipped (couldn't open)") : 
EXIT SUB 
 1268     .FileIncl &= !
"\n" & fnam & !
"\r" 
 1270     VAR pars_old = .Pars : .Pars = 
NEW Parser(.EmitIF)
 
 1271     .Pars->UserTok = pars_old->UserTok
 
 1273     MSG_CONT(
"include ...")
 
 1279     DELETE .Pars : .Pars = pars_old