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
114 FUNCTION Parser.demuxNam(
BYVAL MinTk
AS INTEGER = TOK_WORD,
BYVAL DeclMod
AS INTEGER = 0)
AS INTEGER
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
226 IF *Tk = TOK_AS
THEN As_Tok = Tk : SKIP
ELSE RETURN MSG_ERROR
228 SELECT CASE AS CONST *Tk
229 CASE TOK_SUB : FunTok = Tk
230 CASE TOK_FUNC : FunTok = Tk
232 IF *Tk = TOK_CONS
THEN Co1Tok = Tk : SKIP
233 IF *Tk < TOK_BYTE
ORELSE *Tk > TOK_WORD
THEN RETURN MSG_ERROR
234 TypTok = Tk : FunTok = 0
238 SELECT CASE AS CONST *Tk
240 IF FunTok
THEN TypTok = 0 :
RETURN MSG_ERROR
241 IniTok = Tk :
RETURN Tk - t
242 CASE TOK_BROPN :
IF 0 = FunTok
THEN RETURN Tk - t
246 IF *Tk = TOK_CONS
THEN
248 IF *Tk <> TOK_PTR
THEN TypTok = 0 :
RETURN MSG_ERROR
250 IF *Tk <> TOK_PTR
THEN RETURN Tk - t
253 PtrTok = Tk :
WHILE *Tk = TOK_PTR : PtrCount += 1 : SKIP :
WEND
255 IF *Tk = TOK_EQUAL
THEN IniTok = Tk
259 IF *Tk = TOK_EOS
THEN RETURN IIF(*FunTok = TOK_FUNC, MSG_ERROR, TOK_EOS)
261 SELECT CASE AS CONST *Tk
262 CASE TOK_CDEC, TOK_STCL, TOK_PASC : CalTok = Tk : SKIP
265 IF *Tk = TOK_OVER
THEN SKIP
266 IF *Tk = TOK_ALIA
THEN
268 SKIP :
IF *Tk <> TOK_QUOTE
THEN TypTok = 0 :
RETURN MSG_ERROR
277 IF *Tk = TOK_CONS
THEN Co1Tok = Tk : SKIP
279 IF *Tk = TOK_CONS
THEN
281 IF *Tk <> TOK_PTR
THEN FunTok = 0: TypTok = 0 :
RETURN MSG_ERROR
283 PtrTok = Tk :
WHILE *Tk = TOK_PTR : PtrCount += 1 : SKIP :
WEND
285 IF *FunTok = TOK_FUNC
THEN RETURN MSG_ERROR
288 IF *Tk = TOK_STAT
THEN
289 SKIP :
IF *Tk = TOK_EXPO
THEN SKIP
291 IF *Tk = TOK_EXPO
THEN SKIP :
IF *Tk = TOK_STAT
THEN SKIP
292 END IF :
RETURN Tk - t
306 TypTok = 0 : FunTok = 0
310 skipOverComma() : ListCount = count : Export_(@
THIS) : count += 1
311 LOOP UNTIL *Tk <= TOK_COMMA
329 skipOverComma() : ListCount = count : Export_(@
THIS) : count += 1
330 LOOP UNTIL *Tk <= TOK_COMMA
344 TypTok = 0 : FunTok = 0 : LevelCount += 1
347 SELECT CASE AS CONST *Tk
349 SKIP :
IF *Tk = TOK_ENUM
THEN EXIT WHILE
350 Errr(
"END ENUM expected") :
EXIT WHILE
371 VAR in_tk1 =
iif(LevelCount, *Tk1, *StaTok)
376 SELECT CASE AS CONST nextok
377 CASE TOK_AS, TOK_BROPN
379 SELECT CASE AS CONST *Tk1
380 CASE TOK_DIM, TOK_RDIM : SKIP
382 IF Errr(
"type expected1") = MSG_ERROR
THEN CONTINUE DO _
384 IF MSG_ERROR >=
demuxNam(TOK_ABST)
THEN _
385 IF Errr(
"name expected1") = MSG_ERROR
THEN CONTINUE DO _
388 *NamTok = TOK_WORD : ListCount = 0 : Export_(@
THIS)
391 IF MSG_ERROR >=
demuxNam(TOK_ABST)
THEN _
392 IF Errr(
"name expected") = MSG_ERROR
THEN CONTINUE DO _
395 IF Errr(
"type expected") = MSG_ERROR
THEN CONTINUE DO _
398 *NamTok = TOK_WORD : ListCount = 0 : Export_(@
THIS)
403 SELECT CASE AS CONST *Tk1
405 CASE TOK_DIM, TOK_RDIM : SKIP
406 IF MSG_ERROR >=
demuxNam(TOK_ABST)
THEN _
407 IF Errr(
"name expected") = MSG_ERROR
THEN CONTINUE DO _
409 IF *Tk <> TOK_AS
THEN _
410 IF Errr(
"'AS' expected->" &
SubStr(Tk) &
"<-") = MSG_ERROR
THEN CONTINUE DO _
413 IF Errr(
"type expected") = MSG_ERROR
THEN CONTINUE DO _
416 *NamTok = TOK_WORD : ListCount = 0 : Export_(@
THIS)
422 IF Errr(
"type expected") = MSG_ERROR
THEN CONTINUE DO _
424 IF MSG_ERROR >=
demuxNam(TOK_ABST)
THEN _
425 IF Errr(
"name expected") = MSG_ERROR
THEN CONTINUE DO _
428 *NamTok = TOK_WORD : ListCount = 0 : Export_(@
THIS)
432 IF nextok = in_tk1
THEN EXIT DO
433 IF Errr(
"not supported") < MSG_ERROR
THEN EXIT DO
438 IF Errr(
"syntax error " &
SubStr(NamTok)) = MSG_ERROR _
443 CASE TOK_PUBL, TOK_PRIV, TOK_PROT
446 CASE TOK_ENUM, TOK_TYPE, TOK_UNIO, TOK_CLAS
448 IF nextok = TOK_WORD
THEN SKIP : BlockNam =
SubStr ELSE BlockNam =
""
467 VAR count = 0, t = Tk
473 SELECT CASE AS CONST *Tk
474 CASE TOK_BRCLO :
IF count > 0
THEN Errr(
"parameter expected")
475 ListCount = count :
EXIT DO
476 CASE TOK_3DOT : NamTok = Tk : TypTok = 0 : FunTok = 0
478 IF *Tk = TOK_BYVA
ORELSE *Tk = TOK_BYRE
THEN By_Tok = Tk : SKIP
479 IF *Tk <> TOK_AS
ANDALSO *Tk >= TOK_ABST
THEN
487 skipOverComma() : count += 1 : ListCount = count : Export_(@
THIS)
488 LOOP UNTIL *Tk < TOK_COMMA : By_Tok = 0 : Tk = t
507 IF 3 >
tokenize(TO_COLON)
THEN RETURN Errr(
"syntax error")
509 DimTok = 0 : IniTok = 0 : BitTok = 0
510 IF *StaTok = TOK_TYPE
THEN
512 IF MSG_ERROR >=
demuxTyp()
THEN RETURN Errr(
"type expected")
513 IF *Tk = TOK_WORD
THEN NamTok = Tk
ELSE RETURN Errr(
"name expected")
515 IF Emit->Decl_
THEN Emit->Decl_(@
THIS)
518 IF *Tk = TOK_WORD
THEN NamTok = Tk : SKIP
ELSE RETURN Errr(
"name expected")
520 IF MSG_ERROR >=
demuxTyp()
THEN RETURN Errr(
"type expected")
522 IF Emit->Decl_
THEN Emit->Decl_(@
THIS)
527 IF *Tk = TOK_WORD
THEN NamTok = Tk
ELSE RETURN Errr(
"name expected")
529 IF 0 =
Emit->Clas_
THEN RETURN MSG_ERROR
531 IF 9 >
tokenize(TO_END_BLOCK)
THEN RETURN Errr(
"syntax error")
532 Emit->Clas_(@
THIS) :
RETURN MSG_ERROR
546 RETURN IIF(*StaTok = TOK_EXRN, MSG_ERROR,
Errr(
"syntax error"))
547 IF *Tk <> TOK_PRES
THEN DivTok = 0
ELSE DivTok = Tk : SKIP
548 IF *Tk <> TOK_SHAR
THEN ShaTok = 0
ELSE ShaTok = Tk : SKIP
551 IF MSG_ERROR >=
demuxTyp()
THEN RETURN Errr(
"type expected")
552 IF MSG_ERROR >=
demuxNam()
THEN RETURN Errr(
"name expected")
554 IF *StaTok = TOK_EXRN
THEN RETURN MSG_ERROR
555 IF MSG_ERROR >=
demuxNam()
THEN RETURN Errr(
"name expected")
556 IF *Tk = TOK_AS
THEN demuxTyp()
ELSE TypTok = 0 : FunTok = 0
557 IF 0 = TypTok
ANDALSO 0 = FunTok
THEN
558 SELECT CASE AS CONST *StaTok
559 CASE TOK_VAR, TOK_CONS
560 IF 0 = IniTok
THEN RETURN Errr(
"initialization expected")
561 CASE ELSE :
RETURN Errr(
"type expected")
568 IF *Tk <= TOK_EOS
THEN RETURN MSG_ERROR
584 IF 9 >
tokenize(TO_END_BLOCK)
THEN RETURN Errr(
"syntax error")
585 IF *Tk = TOK_WORD
THEN BlockNam =
SubStr : SKIP
ELSE BlockNam =
""
602 IF 9 >
tokenize(TO_END_BLOCK)
THEN RETURN Errr(
"syntax error")
603 IF *Tk <> TOK_WORD
THEN RETURN Errr(
"name expected")
622 SELECT CASE AS CONST ToLast
623 CASE TOK_PUBL, TOK_PRIV, TOK_ABST, TOK_VIRT : DivTok = StaTok
624 CASE ELSE : DivTok = 0
626 IF 9 >
tokenize(TO_END_BLOCK)
THEN RETURN Errr(
"syntax error")
629 IF DivTok
THEN DivTok = Tk1
630 IF MSG_ERROR >=
demuxNam(TOK_WORD, 1)
THEN RETURN Errr(
"name expected")
631 IF MSG_ERROR >=
demuxTyp(1)
THEN RETURN Errr(
"syntax error")
633 FOR i
AS INTEGER = 0
TO 1
634 SELECT CASE AS CONST *Tk
655 IF 3 >
tokenize(TO_COLON)
THEN RETURN Errr(
"syntax error")
672 IF 3 >
tokenize(TO_EOL)
THEN RETURN Errr(
"syntax error")
673 IF *Tk = TOK_ONCE
THEN DivTok = Tk : SKIP
ELSE DivTok = 0
674 IF *Tk <> TOK_QUOTE
THEN RETURN Errr(
"file name expected")
688 IF 3 >
tokenize(TO_END_BLOCK)
THEN RETURN Errr(
"syntax error")
689 IF *Tk <> TOK_WORD
THEN RETURN Errr(
"name expected")
691 IF *Tk <> TOK_BROPN
THEN RETURN Errr(
"'()' expected")
707 IF 3 >
tokenize(TO_EOL)
THEN RETURN Errr(
"syntax error")
708 IF *Tk <> TOK_WORD
THEN RETURN Errr(
"name expected")
710 IF *Tk = TOK_BROPN
ANDALSO Tk[1] = NamTok[1] + NamTok[2] _
731 FOR i
AS INTEGER = Tk[1]
TO EndTok[1]
732 IF Buf[i] =
ASC(!
"\n")
THEN z -= 1
735 ErrMsg =
"-error(" & z &
"): " & E &
", found '" &
SubStr(Tk) &
"' "
737 SELECT CASE AS CONST *StaTok
738 CASE TOK_DIM : ErrMsg &=
"(DIM)"
739 CASE TOK_RDIM : ErrMsg &=
"(REDIM)"
740 CASE TOK_VAR : ErrMsg &=
"(VAR)"
741 CASE TOK_CONS : ErrMsg &=
"(CONST)"
742 CASE TOK_STAT : ErrMsg &=
"(STATIC)"
743 CASE TOK_COMM : ErrMsg &=
"(COMMON)"
744 CASE TOK_EXRN : ErrMsg &=
"(EXTERN)"
745 CASE TOK_TYPE : ErrMsg &=
"(TYPE)"
746 CASE TOK_CLAS : ErrMsg &=
"(CLASS)"
747 CASE TOK_SUB : ErrMsg &=
"(SUB)"
748 CASE TOK_FUNC : ErrMsg &=
"(FUNCTION)"
749 CASE TOK_PROP : ErrMsg &=
"(PROPERTY)"
750 CASE TOK_CTOR : ErrMsg &=
"(CONSTRUCTOR)"
751 CASE TOK_DTOR : ErrMsg &=
"(DESTRUCTOR)"
752 CASE TOK_NAMS : ErrMsg &=
"(NAMESPACE)"
753 CASE TOK_SCOP : ErrMsg &=
"(SCOPE)"
754 CASE TOK_ENUM : ErrMsg &=
"(ENUM)"
755 CASE TOK_UNIO : ErrMsg &=
"(UNION)"
756 CASE TOK_DECL : ErrMsg &=
"(DECLARE)"
757 CASE TOK_DEFI : ErrMsg &=
"(#DEFINE)"
758 CASE TOK_MACR : ErrMsg &=
"(#MACRO)"
759 CASE ELSE : ErrMsg &=
"(???)"
761 IF Emit->Error_
THEN Emit->Error_(@
THIS)
764 RETURN IIF(Buf[Po] = 0, MSG_STOP, MSG_ERROR)
777 SELECT CASE AS CONST Buf[*A]
778 CASE ASC(
"A"),
ASC(
"a")
780 CASE "AS" :
RETURN TOK_AS
781 CASE "ALIAS" :
RETURN TOK_ALIA
782 CASE "ANY" :
RETURN TOK_ANY
783 CASE "ABSTRACT" :
RETURN TOK_ABST
785 CASE ASC(
"B"),
ASC(
"b")
787 CASE "BYTE" :
RETURN TOK_BYTE
788 CASE "BYREF" :
RETURN TOK_BYRE
789 CASE "BYVAL" :
RETURN TOK_BYVA
791 CASE ASC(
"C"),
ASC(
"c")
793 CASE "CAST" :
RETURN TOK_CAST
794 CASE "CDECL" :
RETURN TOK_CDEC
795 CASE "CLASS" :
RETURN TOK_CLAS
796 CASE "CONST" :
RETURN TOK_CONS
797 CASE "COMMON" :
RETURN TOK_COMM
798 CASE "CONSTRUCTOR" :
RETURN TOK_CTOR
800 CASE ASC(
"D"),
ASC(
"d")
802 CASE "DIM" :
RETURN TOK_DIM
803 CASE "DOUBLE" :
RETURN TOK_DOUB
804 CASE "DEFINE" :
IF ToLast = TOK_LATTE
THEN RETURN TOK_DEFI
805 CASE "DECLARE" :
RETURN TOK_DECL
806 CASE "DESTRUCTOR" :
RETURN TOK_DTOR
808 CASE ASC(
"E"),
ASC(
"e")
810 CASE "END" :
RETURN TOK_END
811 CASE "ENUM" :
RETURN TOK_ENUM
812 CASE "EXTERN" :
RETURN TOK_EXRN
813 CASE "EXPORT" :
RETURN TOK_EXPO
814 CASE "EXTENDS" :
RETURN TOK_EXDS
815 CASE "ENDMACRO" :
IF ToLast = TOK_LATTE
THEN RETURN TOK_EMAC
817 CASE ASC(
"F"),
ASC(
"f")
819 CASE "FUNCTION" :
RETURN TOK_FUNC
820 CASE "FIELD" :
RETURN TOK_FILD
822 CASE ASC(
"I"),
ASC(
"i")
824 CASE "INCLUDE" :
IF ToLast = TOK_LATTE
THEN RETURN TOK_INCL
825 CASE "INTEGER" :
RETURN TOK_INT
827 CASE ASC(
"L"),
ASC(
"l")
829 CASE "LIB" :
RETURN TOK_LIB
830 CASE "LONG" :
RETURN TOK_LONG
831 CASE "LONGINT" :
RETURN TOK_LINT
833 CASE ASC(
"M"),
ASC(
"m") :
IF USubStr() =
"MACRO" THEN IF ToLast = TOK_LATTE
THEN RETURN TOK_MACR
834 CASE ASC(
"N"),
ASC(
"n") :
IF USubStr() =
"NAMESPACE" THEN RETURN TOK_NAMS
835 CASE ASC(
"O"),
ASC(
"o")
837 CASE "ONCE" :
RETURN TOK_ONCE
838 CASE "OPERATOR" :
RETURN TOK_OPER
839 CASE "OVERLOAD" :
RETURN TOK_OVER
841 CASE ASC(
"P"),
ASC(
"p")
843 CASE "PTR" :
RETURN TOK_PTR
844 CASE "PEEK" :
RETURN TOK_PEEK
845 CASE "POINTER" :
RETURN TOK_PTR
846 CASE "PRESERVE" :
RETURN TOK_PRES
847 CASE "PROPERTY" :
RETURN TOK_PROP
848 CASE "PUBLIC" :
RETURN TOK_PUBL
849 CASE "PRIVATE" :
RETURN TOK_PRIV
850 CASE "PROTECTED" :
RETURN TOK_PROT
851 CASE "PASCAL" :
RETURN TOK_PASC
853 CASE ASC(
"R"),
ASC(
"r") :
IF USubStr() =
"REDIM" THEN RETURN TOK_RDIM
854 CASE ASC(
"S"),
ASC(
"s")
856 CASE "SUB" :
RETURN TOK_SUB
857 CASE "SCOPE" :
RETURN TOK_SCOP
858 CASE "SHORT" :
RETURN TOK_SHOR
859 CASE "SINGLE" :
RETURN TOK_SING
860 CASE "SHARED" :
RETURN TOK_SHAR
861 CASE "STRING" :
RETURN TOK_STRI
862 CASE "STATIC" :
RETURN TOK_STAT
863 CASE "STDCALL" :
RETURN TOK_STCL
865 CASE ASC(
"T"),
ASC(
"t") :
IF USubStr() =
"TYPE" THEN RETURN TOK_TYPE
866 CASE ASC(
"U"),
ASC(
"u")
868 CASE "UNION" :
RETURN TOK_UNIO
869 CASE "UBYTE" :
RETURN TOK_UBYT
870 CASE "ULONG" :
RETURN TOK_ULNG
871 CASE "ULONGINT" :
RETURN TOK_ULIN
872 CASE "UINTEGER" :
RETURN TOK_UINT
873 CASE "USHORT" :
RETURN TOK_USHO
875 CASE ASC(
"V"),
ASC(
"v")
877 CASE "VAR" :
RETURN TOK_VAR
878 CASE "VIRTUAL" :
RETURN TOK_VIRT
880 CASE ASC(
"W"),
ASC(
"w")
882 CASE "WITH" :
RETURN TOK_WITH
883 CASE "WSTRING" :
RETURN TOK_WSTR
885 CASE ASC(
"Z"),
ASC(
"z") :
IF USubStr() =
"ZSTRING" THEN RETURN TOK_ZSTR
886 END SELECT :
RETURN TOK_WORD
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" & _
1192 IF BitTok[3] = TOK_WORD
THEN RETURN ": " &
SubStr(BitTok + 3)
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