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?
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. –
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 –
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? –