これは私の 3 年次プログラミング言語クラスの宿題であり、そのための助けを求めていることを前置きしたいと思います。私の課題は次のとおりです。
締め切り: 2013 年 2 月 22 日午後 11 時 55 分
提出: 以下を CMS にアップロードしてください。
1. ソース コード
2. 使用した入力ファイルを含むプログラム実行のスクリーン ショット次の EBNF 記述によって生成された言語を解析する再帰降下パーサーを作成するには、任意のプログラミング言語を使用してください。パーサーは、入力プログラムに構文エラーがあるかどうかを検出する必要があります。エラーの内容と場所を特定する必要はありません。
<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)
変に見える記号は、右向きの矢印だけです。
現時点での私の問題は、プログラミングよりも論理的です。最初の試みで、入力プログラム全体を読み取り、文字列に保存し、その文字列を解析して、すべての記号を端末、expr、またはあなた。
最終的に、この方法は機能しないことがわかりました。A: RDP ではないと思います。B: 非端末の多くは 1 つ以上のステートメントで構成されています。
私はそのアプローチをあきらめ、プログラミングにこれ以上時間を費やす前に、すべてを疑似的に処理することにしました。私の新しいアイデアは、非終端記号ごとに 1 つのメソッドを作成し、それらのメソッドの間で期待して、入力文字列記号を記号ごとに解析することでした。このアプローチは論理的に思えましたが、疑似コードを書き始めると、何をする必要があるかについて非常に迷い、混乱しました。 このコードをどのように仕上げますか?
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
}
参考までに、パーサーのサンプル入力プログラムは次のようになります。
begin
total = var1 + var2;
while (var1 < var2)
while ( var3 > var4)
var2 = var2 - var1
end