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