我几天前发布了关于将EBNF语法转换为CFG的信息。好吧,我想我现在有了它的主旨,但我对这个特别的一点感到困惑:
你会如何转换:
MultiplicativeExpr -> PrimaryExpr (( '*' | '/' ) PrimaryExpr)*
到CFG?
我的尝试是在最后删除*(意味着0或更多)并用递归的方式替换它。
答案 0 :(得分:0)
你有正确的想法。使用附加变量(递归),您可以这样做:
MultiplicativeExpr -> PrimaryExpr SignExprList
SignExprList -> ε | '*' PrimaryExpr SignExprList | '/' PrimaryExpr SignExprList
当然这不是唯一的方法,例如您也可以执行Sign -> '*' | '/'
之类的操作,并在SignExprList
中使用...