140 lines
2.4 KiB
Text
140 lines
2.4 KiB
Text
BYTE FUNC IsSign(CHAR c)
|
|
IF c='- OR c='+ THEN
|
|
RETURN (1)
|
|
FI
|
|
RETURN (0)
|
|
|
|
BYTE FUNC IsDigit(CHAR c)
|
|
IF c>='0 AND c<='9 THEN
|
|
RETURN (1)
|
|
FI
|
|
RETURN (0)
|
|
|
|
BYTE FUNC IsDot(CHAR c)
|
|
IF c='. THEN
|
|
RETURN (1)
|
|
FI
|
|
RETURN (0)
|
|
|
|
BYTE FUNC IsExpSymbol(CHAR c)
|
|
IF c='E OR c='e THEN
|
|
RETURN (1)
|
|
FI
|
|
RETURN (0)
|
|
|
|
BYTE FUNC IsNumeric(CHAR ARRAY s)
|
|
DEFINE S_BEGIN="0"
|
|
DEFINE S_SIGN="1"
|
|
DEFINE S_BEFORE_DOT="2"
|
|
DEFINE S_DOT="3"
|
|
DEFINE S_AFTER_DOT="4"
|
|
DEFINE S_EXP_SYMBOL="5"
|
|
DEFINE S_EXP_SIGN="6"
|
|
DEFINE S_EXP="7"
|
|
|
|
BYTE i,state
|
|
CHAR c
|
|
|
|
i=1
|
|
state=S_BEGIN
|
|
WHILE i<=s(0)
|
|
DO
|
|
c=s(i)
|
|
|
|
IF state=S_BEGIN THEN
|
|
IF IsSign(c) THEN
|
|
state=S_SIGN
|
|
ELSEIF IsDigit(c) THEN
|
|
state=S_BEFORE_DOT
|
|
ELSEIF IsDot(c) THEN
|
|
state=S_DOT
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSEIF state=S_SIGN THEN
|
|
IF IsDigit(c) THEN
|
|
state=S_BEFORE_DOT
|
|
ELSEIF IsDot(c) THEN
|
|
state=S_DOT
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSEIF state=S_BEFORE_DOT THEN
|
|
IF IsDigit(c) THEN
|
|
state=S_BEFORE_DOT
|
|
ELSEIF IsDot(c) THEN
|
|
state=S_DOT
|
|
ELSEIF IsExpSymbol(c) THEN
|
|
state=S_EXP_SYMBOL
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSEIF state=S_DOT THEN
|
|
IF IsDigit(c) THEN
|
|
state=S_AFTER_DOT
|
|
ELSEIF IsExpSymbol(c) THEN
|
|
state=S_EXP_SYMBOL
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSEIF state=S_AFTER_DOT THEN
|
|
IF IsDigit(c) THEN
|
|
state=S_AFTER_DOT
|
|
ELSEIF IsExpSymbol(c) THEN
|
|
state=S_EXP_SYMBOL
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSEIF state=S_EXP_SYMBOL THEN
|
|
IF IsSign(c) THEN
|
|
state=S_EXP_SIGN
|
|
ELSEIF IsDigit(c) THEN
|
|
state=S_EXP
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSEIF state=S_EXP_SIGN THEN
|
|
IF IsDigit(c) THEN
|
|
state=S_EXP
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSEIF state=S_EXP THEN
|
|
IF IsDigit(c) THEN
|
|
state=S_EXP
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
ELSE
|
|
RETURN (0)
|
|
FI
|
|
i==+1
|
|
OD
|
|
|
|
IF state=S_BEGIN OR state=S_DOT OR
|
|
state=S_EXP_SIGN OR state=S_EXP_SIGN THEN
|
|
RETURN (0)
|
|
FI
|
|
RETURN (1)
|
|
|
|
PROC Test(CHAR ARRAY s)
|
|
BYTE res
|
|
|
|
res=IsNumeric(s)
|
|
Print(s)
|
|
Print(" is ")
|
|
IF res=0 THEN
|
|
Print("not ")
|
|
FI
|
|
PrintE("a number.")
|
|
RETURN
|
|
|
|
PROC Main()
|
|
Test("56233")
|
|
Test("-315")
|
|
Test("1.36")
|
|
Test("-5.126")
|
|
Test("3.7E-05")
|
|
Test("1.23BC")
|
|
Test("5.6.3")
|
|
RETURN
|