字句解析のつづき
あ、できた
a+b* c/ d-e 結果: ((a) + ((b * c) / d)) - e
文法はいじらんで字句解析で次がEOLを受け入れるっぽかったらEOLをぶちこむ
EOLを受け入れへんかったら飲み込むって
%default Node %token<Node> var expr %left '+' '-' %left '*' '/' %% program : void | program stmt stmt : void EOL | expr EOL {Console.WriteLine($1.Name)} expr : var {$$ = $1} | expr '+' expr {$1.Name = "(" + $1.Name + ") + " + $3.Name : $$ = $1} | expr '-' expr {$1.Name = "(" + $1.Name + ") - " + $3.Name : $$ = $1} | expr '*' expr {$1.Name = "(" + $1.Name + " * " + $3.Name + ")" : $$ = $1} | expr '/' expr {$1.Name = "(" + $1.Name + " / " + $3.Name + ")" : $$ = $1} var : VAR {$$ = New Node With {.Name = $1.Name}} void :
ちょっとこれで書き直してみようか
あとはインデントでブロックにするにはどうすればいいんだろうか
Private eol_ As New Token(SymbolTypes.EOL) Dim c As Char = Me.NextChar Do While Char.IsWhiteSpace(c) Me.ReadChar() If Me.Parser.IsAccept(Me.eol_) AndAlso (c = Convert.ToChar(10) OrElse c = Convert.ToChar(13)) Then Return Me.CreateEndOfLine If Me.EndOfStream() Then Return Me.CreateEndOfToken c = Me.NextChar Loop