<nonterminal>
a/b := a or b
好吧让我们开始:
<Noun>::= *** // i manged to figure this out
<Constant>::= *** // i manged to figure this out
<operator>::= "+"/"-"/"*" // i manged to figure this out
问题现在就在这里
<Expression>::= <Expression><operator><Expression> / (<Expression>) / <Noun> / <Constant>
我的尝试就像这样
result Object是一个包含两个属性的对象
boolean t:如果语句为true或false则返回
int pos:返回我们应该继续通过令牌数组读取的位置
private result Exp (int in){
result x=new result(false,0);
if(nom(in).t){x.t=true; x.pos=in+1;} else
if(Constante(in).t){x.t=true; x.pos=Constante(in).pos+1;} else
if(mot(in).equals("(")){x.t=(Exp(in+1).t&&mot(Exp(in+1).pos).equals(")"));
x.pos=Exp(in+1).pos+1;} else
{x.t=Exp(in).t&&
Operateur(Exp(in).pos).t &&
Exp(Operateur(Exp(in).pos).pos).t;
x.pos=Exp(Operateur(Exp(in).pos).pos).pos+1;}
return x;
}
以下测试的结果是
jack = true(正确)
25 =真(正确)
(jack)= true(正确)
(jack(= false(正确)
((jack)= false(正确)
((jack))= true(正确)
但是当使用运算符测试表达式时,它总是返回false
(jack + sami)= false(不正确,应该是真的)
答案 0 :(得分:1)
目前由于实施顺序而失败。 你的规则
<Expression>::= <Expression><operator><Expression> / (<Expression>) / <Noun> / <Constant>
实现为
<Expression>::= <Noun> / <Constant> / (<Expression>) / <Expression><operator><Expression>
这意味着一旦函数遇到它返回的名词; 所以比赛就像这样
token 1 "(" == <Noun>//false goto next
token 1 "(" == <Constant>//false goto next
token 1 "(" == "("//yes parse token 2 as sub expression
token 2 "jack" == <Noun>//yes return true
token 3 "+" == ")"//no parent sub expression failed.. return false
要修复此具体示例,您应该将ifs的顺序更改为至少类似于
的内容<Expression>::= <Expression><operator><Expression> / <Noun> / <Constant> / (<Expression>)
但真正的问题来自你的语法..它应该像
<Expression>::= <Primitive> / <Primitive><operator><Primitive>
<Primitive>::= <Noun> / <Constant> / (<Expression>)