Java中简单的“If-Then-Else”下降解析器(家庭作业)

Java中简单的“If-Then-Else”下降解析器(家庭作业),java,parsing,Java,Parsing,网络上没有任何代码片段显示如何解析这些含糊不清的语法,至少一些伪代码是非常值得的 在下面的语法中,大写非终结符、带引号的终结符和其他符号是使用终结符和终结符完成的正则表达式 STATS ::= (STAT)* STAT ::= IF_STAT IF_STAT ::= "if" EXP "then" STAT ("else" STAT)? | EXP EXP ::= IDENT IDENT ::= ('a'-'z''A'-'Z')+ if语句在以下代码中不明确 if a then if b th

网络上没有任何代码片段显示如何解析这些含糊不清的语法,至少一些伪代码是非常值得的

在下面的语法中,大写非终结符、带引号的终结符和其他符号是使用终结符和终结符完成的正则表达式

STATS ::= (STAT)*
STAT ::= IF_STAT
IF_STAT ::= "if" EXP "then" STAT ("else" STAT)? | EXP
EXP ::= IDENT
IDENT ::= ('a'-'z''A'-'Z')+
if语句在以下代码中不明确

if a then if b then c else d
可以读作

if a then{
    if b then 
        c
    else
        d
}

现在。消除歧义似乎很简单,因为我做得很正确:

STATS ::= (STAT)*
STAT ::= IF_STAT
IF_STAT ::= "if" EXP "then" STAT |
             "if" EXP "then" IF_STAT_EX "else" STAT | 
            EXP
IF_STAT_EX ::= "if" EXP "then" IF_STAT_EX "else" IF_STAT_EX | 
            EXP
EXP ::= IDENT
IDENT ::= ('a'-'z''A'-'Z')+
但是,我没有编写任何能够正确解析以下测试用例的有效解析器,每一行都是不同的测试

//INPUT                                 //EXPECTED OUTPUT
if x then if y then z else w            if x then (if y then z else w)
if x then y else if z then w else k     if x then y else (if z then w else k)
if x then y else if y then w            if x then y else (if y then w )
if x then if y then z else w else k     if x then (if y then z else w) else k
这是一个小班,再现了我所缺少的东西

public class Parser{

    public List<Stat> parseStats(){
        List<Stat> stats = new List<>();
        while(tokenizer.hasTokens())
            stats.add(parseIf());
        return stats;
    }

    private Stat parseIf(){
        // TODO: what here?
    }

    private Exp parseCond(){
        Exp condition = parseIdent();
        tokenizer.consume( "then" );
        return condition;
    }

    private Exp parseIdent(){
        final Ident name = new Ident( tokeziner.toString());
        tokenizer.moveOnNextToken();
        return name;
    }
}

标记器的类型是什么?你在哪里申报的?重要吗?这只是一个字符串切割器,我通过构造函数注入它,以使问题尽可能简短,但根据需要提供尽可能多的信息。它完成了它的工作,所以获取当前令牌字符串,并请求下一个令牌。
public class Parser{

    public List<Stat> parseStats(){
        List<Stat> stats = new List<>();
        while(tokenizer.hasTokens())
            stats.add(parseIf());
        return stats;
    }

    private Stat parseIf(){
        // TODO: what here?
    }

    private Exp parseCond(){
        Exp condition = parseIdent();
        tokenizer.consume( "then" );
        return condition;
    }

    private Exp parseIdent(){
        final Ident name = new Ident( tokeziner.toString());
        tokenizer.moveOnNextToken();
        return name;
    }
}