読者です 読者をやめる 読者になる 読者になる

字句解析のつづき

プログラム

あ、できた

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