网络上没有代码片段,展示了如何解析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;
}
}