我想說這是我的第三年編程語言類的家庭作業,我正在尋找一些幫助。我的任務寫着:Java中的遞歸下降解析器
截止日期: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 ,或者你有什麼。
我終於發現這種方式是行不通的,因爲答:我不認爲它是RDP,B:很多非終端是由多於一個語句組成的。
我放棄了這種方法,並決定在浪費更多時間進行編程之前,我會把所有東西都僞裝出來。我的新想法是爲每個非終結符號製作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
查看http://stackoverflow.com/a/2336769/120163 – 2015-11-30 14:47:28