ネタ元 → 再帰下降構文解析
そのまんま勉強会ネタになりそうなぱわぽをこさえていただきました。
ありがとうござりまするぅ。
で、お礼かたがた「日本語コードならもちっとわかりやすくなんのか」をテスト。
Module 数式の構文解析と評価
Dim 入力文字 As Char
Dim スタック As New System.Collections.Generic.Stack(Of Double)
Dim 変数値 As New System.Collections.Generic.Dictionary(Of Char, Double)
Dim 入力文字列 As String
Sub スタック表示()
For Each value As Double In スタック
Console.Write(" {0}", value)
Next
Console.WriteLine()
End Sub
Sub 一文字読む()
Do
If 入力文字列.Length = 0 Then Return
入力文字 = 入力文字列(0)
入力文字列 = 入力文字列.Remove(0, 1)
Loop While 入力文字 = " "c
End Sub
' 因子(factor) とは ( 式 )
' もしくは 変数
Sub 因子()
If 入力文字 = "("c Then
一文字読む()
式()
If 入力文字 = ")"c Then
一文字読む()
Else
Console.WriteLine("?")
End If
ElseIf 入力文字 >= "a"c AndAlso 入力文字 <= "z"c Then
スタック.Push(変数値(入力文字))
スタック表示()
一文字読む()
Else
Console.WriteLine("?")
End If
End Sub
' 項(term) とは 因子
' もしくは 因子 * 因子
' もしくは 因子 / 因子
Sub 項()
因子()
Do
If 入力文字 = "*"c Then
Console.Write(入力文字)
一文字読む()
因子()
Dim x As Double = スタック.Pop()
Dim y As Double = スタック.Pop()
スタック.Push(x * y)
スタック表示()
ElseIf 入力文字 = "/"c Then
Console.Write(入力文字)
一文字読む()
因子()
Dim x As Double = スタック.Pop()
Dim y As Double = スタック.Pop()
スタック.Push(y / x)
スタック表示()
Else
Exit Do
End If
Loop
End Sub
' 式(expression) とは 項
' もしくは 項 + 項
' もしくは 項 - 項
Sub 式()
項()
Do
If 入力文字 = "+"c Then
Console.Write(入力文字)
一文字読む()
項()
Dim x As Double = スタック.Pop()
Dim y As Double = スタック.Pop()
スタック.Push(x + y)
スタック表示()
ElseIf 入力文字 = "-"c Then
Console.Write(入力文字)
一文字読む()
項()
Dim x As Double = スタック.Pop()
Dim y As Double = スタック.Pop()
スタック.Push(y - x)
スタック表示()
Else
Exit Do
End If
Loop
End Sub
Sub Main()
変数値.Add("a"c, 1)
変数値.Add("b"c, 2)
変数値.Add("c"c, 3)
変数値.Add("d"c, 4)
' 数値を直接入れるのは字句解析がめんどっちーのでパス
入力文字列 = "(a+b)*(c+d)"
一文字読む()
式()
Console.WriteLine("result = {0}", スタック.Pop())
End Sub
End Module
ふ、ふつくしい...