之前我有很多问题,但我发现的每个解决方案都涉及indexOf的使用。就像here。
好吧,我正在实施一个递归下降解析器,并且在执行完每个制作后我都要打印制作,例如" A = B'令牌' (令牌的价值)C"。当制作有许多其他作品和代币时,问题就出现了,如果我在制作开始时将它打印出来,我就不具备每个代币的价值,如果我最后将它打印出来,最终的制作清单将会出现在订单不正确。
所以我做了这样的事情:
String s="";
productions.add(s);
A();
getToken();
B();
s=("A 'token' B");
你可以看到在方法A()中我也可能有类似的东西,所以我会添加很多s =""到列表,因此 indexOf 不会工作。目前我正在这样做:
String s="";
s+= productions.size();
productions.add(s);
A();
getToken();
B();
s=("A 'token' B");
但我总是觉得这个解决方案没有优雅。还有更好的方法吗?
以下是我尝试做的一个示例,请注意它不会起作用,因为您需要一个实现 nextToken 方法的词法分析器
public class parser {
ArrayList<String> productions = new ArrayList<>();
void S(){
//S = A '*' B
String s="";
productions.add(s);
A();
nextToken();
B();
s="S = A '*' B"
printProductions();
}
void A(){
//A = 'ctn' | B
String s="";
productions.add(s);
if(!currentTk=ctn){
s="A = B
B();
}else{
s="A = 'ctn'
}
}
void B(){
//B = 'ctn' '+' 'ctn'
String s="";
productions.add(s);
if(currentTk=ctn){
nextToken();
if(currentTk=ctn){
if(currentTk=ctn){
nextToken();
s= "'ctn' '+' 'ctn'"
}
}
}
}
}