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

时间:2015-03-28 14:40:55

标签: java parsing

网络上没有代码片段,展示了如何解析ambiguos" if-then-else"语法(至少有些伪代码非常值得)

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

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
}

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;
    }
}

0 个答案:

没有答案