|
> No.3434[元記事へ]
続き 5
EXTERNAL FUNCTION TRANSFUNC$(X$) !'関数名変換ルーチン SQR(X) → sqrt(x)
OPTION ARITHMETIC NATIVE
RESTORE
DO
READ IF MISSING THEN EXIT DO:S$,T$
LET FL=0
FOR I=1 TO FC
IF POS(LCASE$(X$),FUNCNAME$(I))>0 THEN !'FUNCTION定義で同一関数名ではない
LET FL=1
IF FUNCNAMENOARG$(I)<>"" THEN !'DEF文定義の引数なしの場合「()」をつける DEF F=X^2 , LET Y=Y+F → =y=y+f();
LET X$=TRANSFORM$(X$,UCASE$(FUNCNAMENOARG$(I)(1:LEN(FUNCNAMENOARG$(I))-2)),"#")
LET X$=TRANSFORM$(X$,"#",FUNCNAMENOARG$(I))
END IF
END IF
NEXT I
IF FL=0 THEN
DO WHILE POS(X$,S$)>0 AND LITERAL(X$,S$)=0
LET X$=TRANSFORM$(X$,S$,T$)
LOOP
LET SS$=S$(1:LEN(S$)-1)&" ("
DO WHILE POS(X$,SS$)>0 AND LITERAL(X$,SS$)=0
LET X$=TRANSFORM$(X$,SS$,T$)
LOOP
END IF
LOOP
DO
LET FL=0
!'IF POS(X$,"POS(")>0 THEN
!' LET I=POS(X$,"POS(")
!' LET X$=TRANSFORM$(X$,"POS(","")
!' LET X$=TRANSFORM$(X$,",",".find(")
!' LET I=POS(X$,")",I)
!' LET X$(I:I)=",0)"
!' LET FL=1
!'END IF
!' IF POS(X$,"VAL(")>0 AND POS(X$,"BVAL(")=0 THEN
!' LET X$=TRANSFORM$(X$,"VAL(","atod(")
!' LET X$=TRANSFORM$(X$,")",".c_str(}}")
!' LET X$=TRANSFORM$(X$,"}",")")
!' LET FL=1
!' END IF
IF POS(X$,"^")>0 AND LITERAL(X$,"^")=0 THEN
DO WHILE POS(X$,"^")>0
LET N=POS(X$,"^")
LET SP=0
FOR I=N-1 TO 1 STEP -1
IF X$(I:I)=")" OR X$(I:I)="]" THEN LET SP=SP+1
IF SP>0 AND (X$(I:I)="(" OR X$(I:I)="[") THEN LET SP=SP-1
IF POS("=,+-*/(<>[ ",X$(I:I))>0 AND SP=0 AND (I<>N-1 OR X$(I:I)<>" ") THEN
IF POS("(",X$(I:I))>0 AND POS("+-*/=,",X$(I-1:I-1))>0 OR POS("<>=,+-*/ ",X$(I:I))>0 OR POS("abcdefghijklmnopqrstuvwxyz",LCASE$(X$(I-1:I-1)))=0 OR POS("([",X$(I:I))>0 AND POS("abcdefghijklmnopqrstuvwxyz",LCASE$(X$(I-1:I-1)))>0 AND (X$(N-1:N)<>")^" AND X$(N-1:N)<>"]^") THEN
IF X$(N-1:N)=")^" OR X$(N-1:N)="]^" THEN
IF (POS("+-*/ ",X$(I-1:I-1))>0 OR X$(I-1:I)="((") AND POS("abcdefghijklmnopqrstuvwxyz",LCASE$(X$(I-1:I-1)))=0 THEN
LET X$(I:I-1)="pow("
ELSE
LET X$(I+1:I)="pow("
END IF
ELSE
LET X$(I+1:I)="pow("
END IF
EXIT FOR
END IF
ELSEIF SP=0 AND I=1 AND POS(",(=+-*/[ ",X$(I:I))=0 THEN
LET X$="pow("&X$
EXIT FOR
END IF
NEXT I
LET N=POS(X$,"^")
LET SP=0
FOR I=N+1 TO LEN(X$)
IF X$(I:I)="(" OR X$(I:I)="[" THEN LET SP=SP+1
IF SP>0 AND (X$(I:I)=")" OR X$(I:I)="]") THEN LET SP=SP-1
IF POS(",)+-*/]<> ",X$(I:I))>0 AND SP=0 AND (I<>N+1 OR X$(I:I)<>" ") THEN
LET X$(I:I-1)=")"
EXIT FOR
ELSEIF SP=0 AND I=LEN(X$) AND POS(",)+-*/] ",X$(I:I))=0 THEN
LET X$=X$&")"
END IF
NEXT I
LET X$(N:N)=","
LOOP
LET FL=1
END IF
IF POS(X$,"LEN(")>0 THEN
LET I=POS(X$,"LEN(")
LET X$=TRANSFORM$(X$,"BLEN(","")
LET X$=TRANSFORM$(X$,"LEN(","")
LET I=POS(X$,")",I)
LET X$(I:I)=""
LET X$(I:I)=".size()"
LET FL=1
END IF
!' IF POS(X$,"ANGLE(")>0 THEN
!' LET I=POS(X$,"ANGLE(")
!' LET J=POS(X$,",",I)
!' LET AA$=X$(I+6:J-1)
!' LET K=POS(X$,")",J)
!' LET BB$=X$(J+1:K-1)
!' LET X$=TRANSFORM$(X$,"ANGLE(","atan2(")
!' LET X$=TRANSFORM$(X$,AA$,REPEAT$("#",LEN(AA$)))
!' LET X$=TRANSFORM$(X$,BB$,REPEAT$("&",LEN(BB$)))
!' LET X$=TRANSFORM$(X$,REPEAT$("#",LEN(AA$)),BB$)
!' LET X$=TRANSFORM$(X$,REPEAT$("&",LEN(BB$)),AA$)
!' LET FL=1
!' END IF
!' IF POS(X$,"LEFT$(")>0 THEN
!' LET I=POS(X$,"LEFT$(")
!' LET X$=TRANSFORM$(X$,"LEFT$(","")
!' LET I=POS(X$,",",I)
!' LET X$(I:I)=".substr(0,"
!' LET FL=1
!' END IF
!' IF POS(X$,"RIGHT$(")>0 THEN
!' LET I=POS(X$,"RIGHT$(")
!' LET BETWEEN$=BETWEENSTRING$(X$,"RIGHT$(",",")
!' LET NUM$=BETWEENSTRING$(X$,",",")")
!' LET X$=TRANSFORM$(X$,"RIGHT$(","")
!' LET I=POS(X$,",",I)
!' LET X$(I:I)=".substr("&BETWEEN$&".size()-"&NUM$&","
!' LET FL=1
!' END IF
!' IF POS(X$,"MID$(")>0 THEN
!' DIM C$(3)
!' LET J=POS(X$,"MID$(")
!' LET SP=0
!' FOR I=J+5 TO LEN(X$)
!' IF X$(I:I)="," THEN LET SP=SP+1
!' IF SP=2 AND X$(I:I)=")" THEN EXIT FOR
!' NEXT I
!' CALL TOKUN(X$(J:I),C$)
!' LET X$=TRANSFORM$(X$,"MID$("&C$(1),C$(1)&".subst("&C$(2)&"-1,"&C$(3)&")")
!' LET FL=1
!' END IF
!' IF POS(X$,"BITAND(")>0 THEN
!' LET I=POS(X$,"BITAND(")
!' LET I=POS(X$,",",I)
!' LET X$(I:I)="&"
!' LET X$=TRANSFORM$(X$,"BITAND","")
!' LET FL=1
!' END IF
!' IF POS(X$,"BITOR(")>0 THEN
!' LET I=POS(X$,"BITOR(")
!' LET I=POS(X$,",",I)
!' LET X$(I:I)="|"
!' LET X$=TRANSFORM$(X$,"BITOR","")
!' LET FL=1
!' END IF
!' IF POS(X$,"BITXOR(")>0 THEN
!' LET I=POS(X$,"BITXOR(")
!' LET I=POS(X$,",",I)
!' LET X$(I:I)="^"
!' LET X$=TRANSFORM$(X$,"BITXOR","")
!' LET FL=1
!' END IF
!' IF POS(X$,"BITNOT(")>0 THEN
!' LET X$=TRANSFORM$(X$,"BITNOT","~")
!' LET FL=1
!' END IF
IF POS(X$,"&&")=0 AND POS(X$,"&")>0 AND LITERAL(X$,"&")=0 THEN
LET X$=TRANSFORM$(X$,"&","+")
LET FL=1
END IF
LET I=POS(X$,"/")
IF I>0 THEN
LET SW=0
LET I=0
DO
LET I=I+1
IF X$(I:I)=CHR$(34) THEN LET SW=1-SW
IF SW=0 AND X$(I:I)="/" AND X$(I:I+8)<>"/(double)" THEN
LET K=0
LET L=0
FOR J=I-1 TO 1 STEP -1 !'被除数
IF POS("0123456789",X$(J:J))>0 THEN !'定数か
LET K=1
END IF
IF POS("abcdefghijklmnopqrstuvwxyz",LCASE$(X$(J:J)))>0 THEN !'変数、関数なら
LET K=0 !'変数名 A123など
EXIT FOR
END IF
IF POS("= ;,+-*/<>()[]",X$(J:J))>0 AND (J<>I-1 OR X$(J:J)<>" ") THEN EXIT FOR
NEXT J
FOR J=I+1 TO LEN(X$) !'除数
IF POS("0123456789",X$(J:J))>0 THEN
LET L=1
END IF
IF POS("abcdefghijklmnopqrstuvwxyz",LCASE$(X$(J:J)))>0 THEN !'変数、関数なら
LET L=0
EXIT FOR
END IF
IF POS(" ;,+-*/<>()[]",X$(J:J))>0 AND (J<>I+1 OR X$(J:J)<>" ") THEN EXIT FOR
NEXT J
IF K=1 AND L=1 THEN !'共に定数なら
LET X$(I:I)="/(double)" !'double型へキャスト
LET I=I+8
LET FL=1
END IF
END IF
LOOP UNTIL I>=LEN(X$)
END IF
IF POS(X$,"TIME")>0 AND LITERAL(X$,"TIME")=0 AND POS(X$,"TIME$")=0 THEN
LET X$=TRANSFORM$(X$,"TIME","(unsigned)time(NULL)")
LET FL=1
END IF
IF POS(X$,CHR$(34)&CHR$(34)&CHR$(34)&CHR$(34))>0 THEN !'「PRINT """";A$;""""」
LET X$=TRANSFORM$(X$,CHR$(34)&CHR$(34)&CHR$(34)&CHR$(34),CHR$(39)&CHR$(34)&CHR$(39))
LET FL=1
END IF
LOOP UNTIL FL=0
IF LITERAL(X$,"$")=0 THEN LET X$=TRANSFORM$(X$,"$","_string")
LET TRANSFUNC$=X$
DATA "ABS(","abs(" !'関数名置換リスト BASIC → C/C++
DATA "ARG(","arg("
DATA "ANGLE(","angle("
DATA "ASIN(","asin("
DATA "ATN(","atan("
DATA "ACOS(","acos("
DATA "ACSC(","asin(1.0/" !'「"A・CSC("」
DATA "ASEC(","acos(1.0/"
DATA "ACOT(","atan(1.0/"
DATA "ATANH(","atanh("
DATA "ASINH(","asinh("
DATA "ACOSH(","acosh("
DATA "ASECH(","asech("
DATA "ACSCH(","acsch("
DATA "ACOTH(","acoth("
DATA "SUBSTR$(","substr(" !'「"SUB・STR$("」「"SU・BSTR$("」
DATA "BSTR$(","bstr("
DATA "BVAL(","bval("
DATA "BITAND(","bit_and("
DATA "BITOR(","bit_or("
DATA "BITXOR(","bit_xor("
DATA "BITNOT(","bit_not(" !'「"BIT・NOT("」
DATA "BITIMP(","bit_imp("
DATA "CEIL(","ceil("
DATA "CHR$(","chr("
DATA "COMB(","comb("
DATA "CONJ(","conj("
DATA "COMPLEX(","complex<double>("
DATA "COS(","cos("
DATA "COT(","1.0/tan("
DATA "CSC(","1.0/sin("
DATA "CSCH(","1.0/sinh("
DATA "COSH(","cosh("
DATA "COTH(","1.0/tanh("
DATA "CBRT(","cbrt(" !'立方根 X^(1/3)
DATA "DEG(","(180.0/pi*"
DATA "DENOM(","denominator("
DATA "EXP(","exp("
DATA "ERF(","erf(" !'誤差関数
DATA "ERFC(","erfc(" !'1-erf(x)
DATA "EPS(","eps("
DATA "FACT(","fact("
DATA "FP(","fp("
DATA "LGAMMA(","lgamma(" !'対数ガンマ関数「"L・GAMMA("」
DATA "GAMMA(","tgamma(" !'ガンマ関数
DATA "GCD(","gcd("
DATA "HYPOT(","hypot(" !'HYPOT(X,Y)=SQR(X*X+Y*Y)
DATA "IP(","ip("
DATA "INT(","floor("
DATA "IM(","imag("
DATA "J0(","j0(" !'ベッセル関数 J0(X)
DATA "J1(","j1(" !'ベッセル関数 J1(X)
DATA "JN(","jn(" !'ベッセル関数 JN(N,X)
DATA "LCM(","lcm("
DATA "LOG(","log("
DATA "LOG2(","log2("
DATA "LOG10(","log10("
DATA "LTRIM$(","ltrim("
DATA "LCASE$(","lcase("
DATA "LEFT$(","left("
DATA "MOD(","fmod("
DATA "MID$(","mid("
DATA "MAX(","fmax("
DATA "MIN(","fmin("
!'DATA "MAX(","tmax("
!'DATA "MIN(","tmin("
DATA "NOT(","(! "
DATA "NUMER(","numerator("
DATA "ORD(","ord("
DATA "PERM(","perm("
DATA "POS(","pos("
DATA "RND","rand()/32768.0"
DATA "ROUND(","round("
DATA "REMAINDER(","fmod("
DATA "RAD(","(pi/180.0*"
DATA "RE(","real("
DATA "RTRIM$(","rtrim("
DATA "RIGHT$(","right("
DATA "REPEAT$(","repeat("
DATA "SPC(","spc("
DATA "SGN(","sgn("
DATA "SQR(","sqrt("
DATA "SIN(","sin("
DATA "SEC(","1.0/cos("
DATA "SINH(","sinh("
DATA "SECH(","1.0/cosh("
!'DATA "STR$(","toString<double>("
DATA "STR$(","str("
DATA "UBOUND(","ubound("
DATA "TRUNCATE(","truncate("
DATA "TAN(","tan("
DATA "TANH(","tanh("
DATA "TAB(","tab("
DATA "UCASE$(","ucase("
DATA "VAL(","val("
DATA "Y0(","y0(" !'ベッセル関数 Y0(X)
DATA "Y1(","y1(" !'ベッセル関数 Y1(X)
DATA "YN(","yn(" !'ベッセル関数 YN(N,X)
END FUNCTION
EXTERNAL FUNCTION TRANSCO$(A$) !'条件式変換
OPTION ARITHMETIC NATIVE
LET S$="_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
LET I=POS(A$,"AND")
IF I>0 AND POS(S$,A$(I-1:I-1))=0 AND POS(S$,A$(I+3:I+3))=0 THEN LET A$=TRANSFORM2$(A$,"AND"," && ")
LET I=POS(A$,"OR")
IF I>0 AND POS(S$,A$(I-1:I-1))=0 AND POS(S$,A$(I+2:I+2))=0 THEN LET A$=TRANSFORM2$(A$,"OR"," || ")
IF POS(A$,"<=")>0 THEN LET A$=TRANSFORM2$(A$,"=<","<=")
IF POS(A$,"=>")>0 THEN LET A$=TRANSFORM2$(A$,"=>",">=")
IF POS(A$,"<=")=0 AND POS(A$,">=")=0 AND POS(A$,"=")>0 THEN
LET A$=TRANSFORM2$(A$,"=","\") !'無限ループ抑制
LET A$=TRANSFORM2$(A$,"\","==")
END IF
IF POS(A$,"<>")>0 THEN LET A$=TRANSFORM2$(A$,"<>","!=")
IF POS(A$,"><")>0 THEN LET A$=TRANSFORM2$(A$,"><","!=")
LET TRANSCO$=A$
END FUNCTION
EXTERNAL FUNCTION TRANSRESERVED$(X$) !'C/C++予約語名変換("_"アンダーバー付加)
OPTION ARITHMETIC NATIVE
RESTORE
DO
READ IF MISSING THEN EXIT DO:A$
LET I=POS(X$,A$)
IF LITERAL(X$,A$)=0 AND (I>0 AND POS(" (),+-*/=<>",X$(I-1:I-1))>0) OR I=1 THEN
LET X$=TRANSFORM2$(X$,A$,"_"&LCASE$(A$))
END IF
LOOP
LET TRANSRESERVED$=X$
DATA ALIGNOF,ALIGNAS,ASM,AUTO,BOOL,BREAK,CATCH,CHAR,CLASS,CONST,CONSTEXPR,CONTINUE,DECLTYPE,DEFAULT,DELETE,DOUBLE
DATA ENUM,EXPLICIT,EXPORT,FALSE,FINAL,FLOAT,FRIEND,INLINE,LONG,MUTABLE,NAMESPACE,NEW,OPERATOR,OVERRIDE
DATA PRIVATE,PROTECTED,REGISTER,SHORT,SIGNED,SIZEOF,STATIC,STRUCT,SWITCH
DATA TEMPLATE,THIS,THROW,TRUE,TRY,TYPEDEF,TYPEID,TYPENAME,NOEXCEPT,NULLPTR,USING,UNION,UNSIGNED,VIRTUAL,VOID,VOLATILE
DATA XOR,RESTRICT
!'DATA COMPL,EXTERN
END FUNCTION
EXTERNAL FUNCTION TRANSARRAYNAME$(X$) !'配列変数名変換 SQR(A(10)) → SQR(a[10])
OPTION ARITHMETIC NATIVE
LET X$=TRIM$(X$)
LET I=0
DO
LET I=POS(X$,"(",I+1)
IF I=0 THEN EXIT DO
RESTORE
LET FL=0
DO
READ IF MISSING THEN EXIT DO:FUNC$
IF LEN(FUNC$)<=I AND X$(I-LEN(FUNC$)+1:I)=FUNC$ THEN
LET FL=1
IF FUNC$=" (" AND POS("abcdefghijklmnopqrstuvwxyz",LCASE$(X$(I-2:I-2)))>0 THEN !' A (N) → a[n]
LET X$(I-1:I-1)=""
LET FL=0
ELSE
EXIT DO
END IF
END IF
IF FUNC$(LEN(FUNC$):LEN(FUNC$))="(" THEN
LET S$=FUNC$(1:LEN(FUNC$)-1)&" ("
IF LEN(S$)<=I AND X$(I-LEN(S$)+1:I)=S$ THEN
LET FL=1
EXIT DO
END IF
END IF
LOOP
IF FL=0 THEN
FOR J=1 TO FC
IF LEN(FUNCNAME$(J))<=I AND LCASE$(X$(I-LEN(FUNCNAME$(J)):I))=FUNCNAME$(J)&"(" THEN
LET FL=1
EXIT FOR
END IF
NEXT J
END IF
IF I>1 AND (X$(I-1:I)="=(" OR X$(I-1:I)="^(") OR X$(1:1)="(" THEN LET FL=1
LET SP=0
IF FL=0 THEN
IF X$(I:I)="(" THEN LET SP=SP+1
LET X$(I:I)="["
LET J=I
DO
LET J=J+1
IF X$(J:J)="(" THEN LET SP=SP+1
IF X$(J:J)=")" THEN LET SP=SP-1
IF SP=0 THEN
LET X$(J:J)="]"
EXIT DO
END IF
IF SP=1 AND X$(J:J)="," THEN LET X$(J:J)="]["
LOOP UNTIL LEN(X$)<=J
END IF
LOOP
IF TYPE$="complex <double> " THEN
LET X$=TRANSFORM$(X$,"[","\static_cast<int>(abs(") !'int型へ強制キャスト(複素数型)
LET X$=TRANSFORM$(X$,"\","[")
LET X$=TRANSFORM$(X$,"]","))\")
LET X$=TRANSFORM$(X$,"\","]")
ELSE
LET X$=TRANSFORM$(X$,"[","\static_cast<int>(") !'int型へ強制キャスト
LET X$=TRANSFORM$(X$,"\","[")
LET X$=TRANSFORM$(X$,"]",")\")
LET X$=TRANSFORM$(X$,"\","]")
END IF
LET TRANSARRAYNAME$=X$
DATA "ABS(","ACOS(","ANGLE(","ARG(","ASIN(","ATN(","ACSC(","ASEC(","ACOT(","ASECH(","ACSCH(","ACOTH("
DATA "BITAND(","BITNOT(","BITOR(","BITXOR(","BLEN(","SUBSTR$(","BSTR$(","BVAL("
DATA "CEIL(","CHR$(","CONJ(","COS(","COSH(","COT(","COTH(","CON(","CSC(","CSCH(","COMPLEX(","COMB("
DATA "DEG(","DENOM(","DET(","DWORD$(","DOT("
DATA "EXP(","EPS(","FACT(","FP(","GCD("
DATA "IM(","INT(","IP(","LBOUND(","LCASE$(","LEFT$(","LEN(","LOG(","LOG10(","LOG2(","LTRIM$("
DATA "MAX(","MID$(","MIN(","MOD(","NOT(","NUMER(","ORD("
DATA "PACKDBL$(","PERM(","POS(","PIXLX(","PIXELY(","RAD(","RE(","REMAINDER(","REPEAT$(","RIGHT$(","RTRIM$(","ROUND("
DATA "SEC(","SECH(","SGN(","SIN(","SINH(","SQR(","STR$(","SIZE(","SPC("
DATA "TAB(","TAN(","TANH(","TRUNCATE("
DATA "UBOUND(","UCASE$(","USING$(","UNPACKDBL(","VAL(","WORD$(","WORLDX(","WORLDY("
DATA "LGAMMA(","GAMMA(","ERF(","ERFC(","HYPOT(","CBRT(","J0(","J1(","JN(","Y0(","Y1(","YN("
DATA "+(","-(","*(","/("," (","((","IF(","OR(","AND(","||(","&&(","pow("
END FUNCTION
EXTERNAL FUNCTION TRIM$(X$) !'空白削除
OPTION ARITHMETIC NATIVE
LET TRIM$=RTRIM$(LTRIM$(X$))
END FUNCTION
EXTERNAL FUNCTION LITERAL(X$,Y$) !'文字定数か
OPTION ARITHMETIC NATIVE
LET K=POS(X$,Y$)
LET S=0
IF K>0 THEN
FOR I=K+1 TO LEN(X$)
IF X$(I:I)=CHR$(34) THEN
LET S=S+1
EXIT FOR
END IF
NEXT I
FOR I=K-1 TO 1 STEP -1
IF X$(I:I)=CHR$(34) THEN
LET S=S+1
EXIT FOR
END IF
NEXT I
END IF
IF S=2 THEN LET LITERAL=1 ELSE LET LITERAL=0
END FUNCTION
EXTERNAL FUNCTION LLCASE$(X$) !'文字定数でないなら小文字化
OPTION ARITHMETIC NATIVE
LET S$=""
LET SW=0
FOR I=1 TO LEN(X$)
IF X$(I:I)=CHR$(34) THEN LET SW=1-SW
IF SW=0 THEN
LET S$=S$&LCASE$(X$(I:I))
ELSE
LET S$=S$&X$(I:I)
END IF
NEXT I
LET LLCASE$=S$
END FUNCTION
EXTERNAL FUNCTION UUCASE$(X$)
OPTION ARITHMETIC NATIVE
LET S$=""
LET SW=0
FOR I=1 TO LEN(X$)
IF X$(I:I)=CHR$(34) THEN LET SW=1-SW
IF SW=0 THEN
LET S$=S$&UCASE$(X$(I:I))
ELSE
LET S$=S$&X$(I:I)
END IF
NEXT I
LET UUCASE$=S$
END FUNCTION
EXTERNAL SUB SETUP(X$) !'手始めに大文字にする 大文字→小文字化(無限ループを抑える)
OPTION ARITHMETIC NATIVE
LET X$=TRIM$(X$)
LET I=POS(X$,"!")
IF I=0 THEN LET I=POS(X$,"REM ")
IF I>0 AND LITERAL(X$,"!")=0 AND LITERAL(X$,"REM ")=0 THEN
LET BEHIND$=X$(I:LEN(X$))
LET X$=X$(1:I-1)
END IF
LET X$=UUCASE$(X$)&BEHIND$
END SUB
|
|