我在学校有一项任务,告诉我们在Java中创建一个自上而下的解析器,遵循这个语法:
assign = id , '=' , expr , ';' ;
expr = term , [ ( ’+’ | ’-’ ) , expr ] ;
term = factor , [ ( ’*’ | ’/’) , term] ;
factor = int | ’(’ , expr , ’)’ ;
我想我已经理解了解析的基本概念,例如"如果我们有一个id,请检查下一个令牌是否是' ='接下来是一个expr,如果接下来是一个'''"。正确的吗?
现在,如果我想检查传入的输入是否是表达式:
我检查令牌以查看是否存在一个术语,然后检查一个" +令牌"或者" - 令牌"是的,最后如果" expr"在那儿。 但是,如果我检查是否有" expr"在那里,它会循环播放,并最终再次检查 ,如果有" expr",又一次又一次。
我不明白我怎么能这样做? 有人能帮助我吗?
亲切的问候,
答案 0 :(得分:0)
他不用担心!
这需要一些思考,但是当调用C1时实际发生的是被调用的expr规则测试一个术语。如果这是构成expr的一组summands中的最后一个术语,则不会有以下加/减,并且C1调用将终止并返回到父解析例程,然后该例程将完成。没有循环。
如果不是最后一个术语,则该术语将被解析,将看到加号/减号,并且C1实例将使另一个呼叫C2返回到expr。这种递归就像一次循环迭代,并按照我们的描述进行处理。
应该工作得很好。