如何处理可能的非终端?

时间:2013-01-16 04:27:22

标签: java grammar ebnf

假设我有一个像这样的EBNF:

<Expr> -> <Term> {( + | - ) <Term>}

{}括号意味着选择零或更多,那么当我逐字逐句地读取字符时,我怎么知道<Term><Term> + <Term> + <Term>之类的东西?

1 个答案:

答案 0 :(得分:1)

假设你有一个递归下降解析器,你想要做的是向前看一个令牌。如果您刚刚阅读了<Term>,而下一个令牌是+-,那么您就会关注此作品。如果不是,那么此<Expr>制作已完成,您将返回到来电者。

要在代码中实现此功能,您需要类似全局lookaheadToken变量的内容。在实际提交特定生产并使用令牌之前,您可以使用该令牌来决定如何继续解析。