【问题标题】:Top-Down Parsing with recursive grammar递归语法的自顶向下解析
【发布时间】:2025-12-09 02:40:01
【问题描述】:

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

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

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

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

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

我不明白我怎样才能让它工作? 有人可以帮我吗?

亲切的问候,

【问题讨论】:

  • 我创建了一个扫描器来读取输入流并将它读取的每个令牌返回给解析器。然后解析器检查返回的标记是否适合语法中的某个地方,并从那里继续解析,分析返回的下一个标记以查看它是否继续遵循语法规则。当我检查是否有表达式时,语法说表达式最后需要一个表达式。这样,“表达式检查”将循环进入自身以查看它是否是表达式,并且在我眼中该循环将是无限的。明白问题了吗?很难解释.. :)
  • 与“术语检查”相同!
  • 我的意思是,显示一些代码,你不应该期望有人为你做这一切
  • 我理解你。问题不在于如何编写代码。这是为了让我了解它是如何工作的。我可以很好地编写代码,但是除非我知道它是如何工作的,否则很难实现某些东西。我做了一些研究,我想我可能已经找到了我一直在寻找的答案。如果没有,我会看看我是否可以为你提供帮助你帮助我的东西:) 谢谢你,Murmeel
  • @Murmeel:有时当您不了解编程概念时,最简单的做法就是实现它并看看会发生什么(确保您有良好的调试器并知道如何使用它)。逐步执行您的实现的行为通常很有启发性。要么很明显你实现的东西做了正确的事,要么很明显它没有。无论哪种情况,您都会学到一些东西。当您可以轻松尝试原型时,何必苦恼?

标签: java parsing grammar recursive-descent topdown


【解决方案1】:

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

他不用担心!

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

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

应该可以正常工作。

【讨论】:

  • 你,先生,让我的大脑运转起来。我钉了它。谢谢。
最近更新 更多