【发布时间】:2011-03-17 04:36:04
【问题描述】:
几天前我发布了关于将 EBNF 语法转换为 CFG 的帖子。好吧,我想我现在已经掌握了它的要点,但我对这个特定的有点卡住了:
你会如何转换:
MultiplicativeExpr -> PrimaryExpr (( '*' | '/' ) PrimaryExpr)*
去CFG?
我在这里的尝试是去掉末尾的 *(表示 0 或更多),并用递归的方式替换它。
【问题讨论】:
几天前我发布了关于将 EBNF 语法转换为 CFG 的帖子。好吧,我想我现在已经掌握了它的要点,但我对这个特定的有点卡住了:
你会如何转换:
MultiplicativeExpr -> PrimaryExpr (( '*' | '/' ) PrimaryExpr)*
去CFG?
我在这里的尝试是去掉末尾的 *(表示 0 或更多),并用递归的方式替换它。
【问题讨论】:
你的想法是正确的。使用附加变量(递归),您可以这样做:
MultiplicativeExpr -> PrimaryExpr SignExprList
SignExprList -> ε | '*' PrimaryExpr SignExprList | '/' PrimaryExpr SignExprList
当然这不是唯一的方法,例如你也可以做类似Sign -> '*' | '/'的事情,并在SignExprList中使用它...
【讨论】: