我在学校有一个作业,告诉我们用Java创建一个自上而下的分析器,它遵循以下语法:
assign = id , '=' , expr , ';' ;
expr = term , [ ( ’+’ | ’-’ ) , expr ] ;
term = factor , [ ( ’*’ | ’/’) , term] ;
factor = int | ’(’ , expr , ’)’ ;我想我已经理解了解析的基本概念,例如“如果我们有一个id,检查下一个令牌是否为'=‘,下一个标记是否为expr,以及后面的一个是否为';'”。对,是这样?
现在,如果我想检查传入的输入是否是表达式:
我检查令牌,看看是否有一个术语,然后如果有一个"+令牌“或-令牌”,最后,如果有一个"expr“。但是,如果我检查那里是否有"expr",它就会循环,并最终检查,,如果有"expr“,然后一次又一次地检查。
我看不出我怎么也能做到这一点吗?有人能帮我吗?
致以亲切的问候,
发布于 2015-11-12 10:33:07
OP似乎担心,如果他为expr规则的代码调用expr的解析规则,它将陷入无限循环。
他不用担心!
这需要一些思考,但当调用C1时,实际发生的情况是,调用expr规则对一个术语进行测试。如果这是包含expr的一组求和中的最后一个术语,那么就不会有后续的加/减,并且C1调用将终止并返回到父解析例程,然后这个例程将完成。没有循环。
如果不是最后一个术语,则将解析该术语,然后会看到加/减,并且C1实例将再次调用C2返回expr。这种递归的作用就像一个循环迭代,并得到我们已经描述过的处理。
应该能正常工作。
https://stackoverflow.com/questions/33667793
复制相似问题