我想说这是我的第三年编程语言类的家庭作业,我正在寻找一些帮助。我的任务写着: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