1

我在学校有一个作业告诉我们用 Java 创建一个自上而下的解析器,它遵循以下语法:

    assign = id , '=' , expr , ';' ;
    expr = term , [ ( ’+’ | ’-’ ) , expr ] ;
    term = factor , [ ( ’*’ | ’/’) , term] ;
    factor = int | ’(’ , expr , ’)’ ;

我想我已经理解了解析的基本概念,例如“如果我们有一个 id,请检查下一个标记是否是 '=' 并且下一个是 expr,以及之后的下一个是否是 ';'”。正确的?

现在,如果我想检查传入的输入是否是一个表达式:

我检查令牌以查看是否存在术语,然后是否存在“+令牌”或“-令牌”,最后是否存在“expr”。但是,如果我检查那里是否有“expr”,它会循环,并最终再次检查是否有“expr”,一次又一次。

我不明白我怎么能得到它的工作?有人能帮我吗?

亲切的问候,

4

1 回答 1

0

OP 似乎担心如果他的 expr 规则代码调用 expr 的解析规则,它将陷入无限循环。

他不用担心!

这需要一些思考,但是当调用 C1 时实际发生的是被调用的 expr 规则测试一个 term。如果这是组成 expr 的加法集合中的最后一项,则将没有后续的加号/减号,C1 调用将终止并返回到父解析例程,然后该例程将完成。没有循环。

如果它不是最后一个术语,则该术语将被解析,将看到加号/减号,并且 C1 实例将再次调用 C2 回 expr。这种递归就像一个循环迭代,并得到我们所描述的处理。

应该工作得很好。

于 2015-11-12T10:33:07.027 回答