Récursif de la Descente de l'Analyseur en Java

Je voudrais commencer en disant que c'est un devoir maison pour ma troisième Année de Langages de Programmation de Classe, et je suis à la recherche d'un peu d'aide avec elle. Ma mission se lit comme suit:

Date limite: le 22 février 2013 à 11:55pm
Présentation: s'il vous Plaît télécharger la suite de la CMS.

1. Le code Source
2. Une capture d'écran de l'exécution de votre programme, y compris le fichier d'entrée utilisé

Utiliser tout langage de programmation vous préférez écrire un appel récursif à la descente de l'analyseur qui analyse le langage généré par le texte suivant EBNF descriptions. Votre analyseur doit détecter si oui ou non le programme d'entrée a des erreurs de syntaxe. Il n'a pas à préciser en quoi et où est l'erreur.

<program>   begin <stmt_list> end
<stmt_list>  <stmt> {;<stmt_list>}
<stmt>    <assign_stmt> | <while_stmt>
<assign_stmt>  <var> = <expr>
<var>  identifier  (An identifier is a string that begins with a letter followed by 0     or more letters and digits)
<expr>  <var> { (+|-) <var>}           
<while_stmt>   while (<logic_expr>)  <stmt>
<logic_expr> ® <var> (< | >) <var>  (Assume that logic expressions have only less than     or greater than operators)

Les symboles de l'air bizarre sont juste des flèches pointant vers la droite.

Mon problème du moment, c'est plus logique alors c'est la programmation: dans ma première tentative, j'ai lu l'intégralité du programme d'entrée dans sauvegardé sur une chaîne, puis analysé cette chaîne et convertis chaque symbole à un terminal, expr, ou ce que vous avez.

Finalement, j'ai trouvé que ce moyen ne serait pas de travail parce que, de Un: je ne pense pas que c'est RDP, B: nombre des non terminaux sont faits de plus de 1 instruction.

J'ai renoncé à cette approche, et décidé avant que je ne perdons plus de temps à la programmation, je voudrais Pseudo tout. Mon idée était de faire de la méthode 1, pour chaque symbole non terminal, et juste analyser la chaîne d'entrée symbole par symbole, en espérant entre ces méthodes. Cette approche semble logique, mais comme j'ai commencé à écrire le pseudo-code j'ai tout perdu et confus quant à ce que je devais faire. Comment aurais-je terminer ce code?

Voici quelques pseudo-code de RDP:

intputString;

public void parseProgram (Symbol.typeIsProgram) {
    if getNextSymbol == "begin" {
        if (intputString.substring (inputString.length()-3,
                inputString.length()) == "end") {
            Symbol stmt_lsit = new Symbol (intputString)
            parseStmt_list(stmt_list);              
        } else {
            Out "error, prog must end with end"
        }
    } else {
        Out "error, prog must begin with begin"
    }   
}

public void parseStmt_list (Stmbol.typeIsStmt_list) {
    symbol = getNextSymbol;
    if (Symbol.typeIsVar) {
        parseVar(symbol)
    } else if (Symbol.typeIsWhile)  {
        //weve only capture if the first word return is a while, we dont have the whole while statement yet
        ParseWhile_stmt(symbol)
    } else { }
}

public void parseStmt () { }
public void parseAssign_stmt () { }
public void parseVar () { }
public void parseExpr () { }
public void parseWhile_stmt () { }
public void parseLogic_expr () { }

public Symbol getNextSymbol() {
    //returns the next symbol in input string and removes it from the input string
}

Juste un avis d'un échantillon du programme d'entrée pour mon analyseur serait.

begin 
total = var1 + var2; 
while (var1 < var2) 
while ( var3 > var4)
var2 = var2 - var1 
end

OriginalL'auteur user1972748 | 2013-02-16