用于微语法分析器的递归方法

时间:2016-01-13 11:59:31

标签: algorithm recursion syntax compiler-construction analyzer

这是规则

<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(不正确,应该是真的)

1 个答案:

答案 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>)