compilerpraktikum / compiler

Compiler
MIT License
3 stars 1 forks source link

Lookahead Recovery #65

Closed Cydhra closed 2 years ago

Cydhra commented 2 years ago

Wenn der Parser eine Unterscheidung durch Lookahead macht, und im else Teil nicht failt sondern einen rekursiven Abstieg macht, dann wird er nach dem Abstieg bei einem illegalen Token falsche Annahmen bezüglich der Recovery treffen. Illegale Tokens müssen vor dem Abstieg gelesen werden:

Theoretisches Beispiel:

when(val p = peek()) {
    case LBRACE -> parseArrayAccess(anc)
    case LPAREN -> parseMethodCall(anc)
    else -> parseStatement(anc)
}

wird bei einem Input von ident!(...) (mit ident gerade gelesen, also peek() == '!' in parseStatement absteigen. Dann wird in parseStatement erkannt dass ! illegal ist, aber dennoch ins Statement parsing recovered, obwohl danach das vorher nicht betrachtete ( steht.

Cydhra commented 2 years ago

Das hier betrifft #53, aber kann auch auf main gefixt werden

Cydhra commented 2 years ago

Tatsächlich kann man hier garnicht so viel ändern, weil man nicht einfach annehmen darf, dass Zeichen zu viel sind, es könnten ja auch welche Fehlen. Fixes dürfen hier nur in Einzelfällen geschehen, nicht generell.