2016-04-01 3 views
1

Ich habe nächste Regeln:Wie schreibe rekursive Abstammung Parser für Aufruf Ausdruck?

factor ::= id | func | (expr) 
func ::= id (list) 
list ::= list , expr | expr 

Ich schreibe einfach Abstieg Parser:

function factor() { 
    if (lookahead === "(") { 
    match("("); 
    expr(); 
    return match(")"); 
    } else { 
    id(); 
    } // How to understand what it can be a func here? 
}; 
​ 
function func() { 
    id(); 
    match("("); 
    list(); 
    match(")"); 
}; 

Aber wie func und id zu kombinieren?

+0

Oft müssen Sie die Tests in einer Parseroutine bestellen, um sicherzustellen, dass die längste Übereinstimmung erfasst wird. Versuchen Sie "facc" in factor aufzurufen, bevor Sie für die ID versuchen. Sie benötigen Unterstützung für das Sichern des Eingabedatenstroms, wenn eine Syntaxübereinstimmungsinstanz fehlschlägt, oder Sie müssen den gemeinsamen Teil der Regeln linksfaktorisieren. Alternative: Heben Sie den Inhalt der Funktion func in die Faktorregel auf. –

+0

Ihrem Parser fehlt eine Menge Unterstützung für die Behandlung von Syntaxfehlern. Siehe meine SO-Antwort zum Schreiben rekursiver Descent-Parser: http://StackOverflow.com/questions/2245962/is-there-a-alternative-for-flex-bison-that-is-usable-on-8-bit- embedded-systems/2336769 # 2336769 –

+0

Ich versuche, links-Faktor zu tun, wenn ich kann. Wie geht es hier? Oder brauche ich Lookahead für 2? Oder Push-Back-Token in Func Regel fehlschlägt? –

Antwort

1

Linkser Faktor die Grammatik wie folgt aus:

factor ::= id ('(' list ')')? | '(' expr ')' 
list ::= expr (',' expr); 

Hinweis sorgfältige Unterscheidung von wörtlichen Klammern '(' und ')' und Syntax Gruppierung Klammern (...)

den Leser überlassen Coding : -}

Überprüfen Sie meine Antwort zum Schreiben rekursiver Parser für Details.

+0

Das ist immer noch gleich. Ich denke, dass die Wiederherstellung die beste Lösung sein wird. –

+0

Ich weiß nicht, was Sie mit "gleich" hier meinen. In dieser Form muss ein RE-Parser den Eingabestream niemals sichern. Wenn Sie die Einfachheit des Ausdrucks oder die Fideltiät einer ursprünglichen Grammatik wünschen, dann ist das Zurückspulen des Eingabestroms zu einem Wiederherstellungspunkt (z. B. wo es war, als eine Erkennungsroutine eingegeben wurde) zweckdienlich, und zwar um den Mehraufwand beim Verfolgen von Tokens zum Aktivieren Zurückspulen, um aufzutreten. –

Verwandte Themen