/***********************************************************
eval.c -- 式の評価
***********************************************************/
#console

Declare Function printf CDECL Lib"msvcrt" (fmt As *Byte, ...) As Long
Declare Function getchar CDECL Lib"msvcrt" () As Long
Declare Function isdigit CDECL Lib"msvcrt" (c As Long) As Long
Declare Function cexit CDECL Lib"msvcrt" Alias "exit" (c As Long) As Long

Dim ch As Long

Sub error(s As *Byte) /* エラー処理 */
printf(Ex"%s\n", s): cexit(1)
End Sub

Sub readch() /* 1文字を読む. 空白は読み飛ばす. */
Do
ch = getchar()
If (ch = -1) Then Exit Sub
Loop while (ch = Asc(Ex" ") Or ch = Asc(Ex"\t"))
End Sub

Function number() As Double /* 数 */
Dim x As Double, a As Double
Dim sign As Long
If (ch = Asc(Ex"+") Or ch = Asc(Ex"-")) Then
sign = ch: readch()
End If
If (isdigit(ch) = 0) Then error(Ex"数か '(' がありません")
x = ch - Asc(Ex"0")
while (1)
readch()
If isdigit(ch) <> 0 Then
x = 10 * x + ch - Asc(Ex"0")
Else
Exit While
End If
Wend
if (ch = Asc(Ex".")) Then
a = 1
while (1)
readch()
If isdigit(ch) <> 0 Then
a = a / 10
x = x + (a) * (ch - Asc(Ex"0"))
Else
Exit While
End If
Wend
End If
If (sign = Asc(Ex"-")) Then number = -x Else number = x
End Function


Function factor() As Double /* 因子 */
Dim x As Double

If (ch <> Asc(Ex"(Ex")) Then
factor = number()
Exit Function
End If
readch(): x = expression()
If (ch <> Asc(Ex")")) Then error(Ex"')' がありません")
readch(): factor = x
End Function


Function term() As Double /* 項 */
Dim x As Double, y As Double

x = factor()
While (1)
If (ch = Asc(Ex"*")) Then
readch(): x = x * factor()
Else If (ch = Asc(Ex"/")) Then
readch(): y = factor()
If (y = 0) Then error(Ex"0 では割れません")
x = x / y
Else
Exit While
End If
Wend
term = x
End Function


Function expression() As Double /* 式 */
Dim x As Double

x = term()
While (1)
If (ch = Asc(Ex"+")) Then
readch(): x = x + term()
Else if (ch = Asc(Ex"-")) Then
readch(): x = x - term()
Else
Exit While
End If
Wend
expression = x
End Function

Sub main()
Dim x As Double

readch(): x = expression()
If (ch <> Asc(Ex"\n")) Then error(Ex"文法の間違いがあります")
printf(Ex"%g\n", x)
End Sub
main()

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2010年10月23日 00:45