PROBLEM Factorial CODE<< string[] allTerminals = new string[] {"a", "b", "c", "d", "e", "n"} ; SymTab symTab = new SymTab(); class SymTab { private Dictionary values = new Dictionary(); public void SetValue(string id, int val) { values[id] = val; } public int GetValue(string id) { int val = 0; values.TryGetValue(id, out val); return val; } } >> NONTERMINALS Program<>. /* return value is the result of the last statement. */ StatSeq<>. AssignStat<>. /* result of assignment is the assigned value */ IncStat<>. DecStat<>. WhileStat<>. /* result of while loop is the result of the last executed statement */ ReturnStat<>. Expr<>. AdditionExpr<>. SubtractionExpr<>. DivisionExpr<>. MultiplicationExpr<>. BooleanExpr<>. NotExpr<>. LessThanExpr<>. EqualExpr<>. AssignStatAndStatSeq<>. WhileStatAndStatSeq<>. ReturnStatAndStatSeq<>. TERMINALS ident<> CONSTRAINTS id IN SET << allTerminals; >> . Const<> CONSTRAINTS val IN SET << Enumerable.Range(0, 100); >> . Nothing<> CONSTRAINTS val IN SET << Enumerable.Repeat(0, 1); >> . RULES Program<> = StatSeq<> SEM << symTab.SetValue("n", n); >> . StatSeq<> = LOCAL << r = 0; >> Nothing<> | AssignStatAndStatSeq<> | WhileStatAndStatSeq<> | ReturnStatAndStatSeq<> | IncStat<> | DecStat<> . AssignStatAndStatSeq<> = StatSeq<> AssignStat<> . WhileStatAndStatSeq<> = StatSeq<> WhileStat<> . ReturnStatAndStatSeq<> = StatSeq<> ReturnStat<> . AssignStat<> = LOCAL << int e; string id;>> ident<> Expr<> SEM << symTab.SetValue(id, e); r = e; >> . IncStat<> = LOCAL << int e; string id;>> ident<> SEM << r = symTab.GetValue(id) + 1; symTab.SetValue(id, r); >> . DecStat<> = LOCAL << int e; string id;>> ident<> SEM << r = symTab.GetValue(id) - 1; symTab.SetValue(id, r); >> . WhileStat<> = LOCAL << bool b; int c = 0; >> SEM << r = 0; >> SEM << while(true && c++ < 100) { >> BooleanExpr<> SEM << if(!b) break; >> StatSeq<> SEM << } >> . ReturnStat<> = Expr<> SEM << return; >> . Expr<> = LOCAL << string id; >> AdditionExpr<> | SubtractionExpr<> | MultiplicationExpr<> | DivisionExpr<> | Const<> | ident<> SEM << r = symTab.GetValue(id); >> . AdditionExpr<> = LOCAL << int e1, e2; >> Expr<> Expr<> SEM << r = e1 + e2; >> . SubtractionExpr<> = LOCAL << int e1, e2; >> Expr<> Expr<> SEM << r = e1 - e2; >> . MultiplicationExpr<> = LOCAL << int e1, e2; >> Expr<> Expr<> SEM << r = e1 * e2; >> . DivisionExpr<> = LOCAL << int e1, e2; >> Expr<> Expr<> SEM << r = e2 == 0 ? 1 : e1 / e2; >> . BooleanExpr<> = LessThanExpr<> | EqualExpr<> | NotExpr<> . NotExpr<> = LOCAL << bool notB; >> BooleanExpr<> SEM << b = !notB; >> . LessThanExpr<> = LOCAL << int lhs, rhs; >> Expr<> Expr<> SEM << b = lhs < rhs; >> . EqualExpr<> = LOCAL << int lhs, rhs; >> Expr<> Expr<> SEM << b = lhs == rhs; >> . MINIMIZE /* could also use the keyword MAXIMIZE here */ << var ns = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; var expected = new int[] { 1,1,2,6,24,120,720,5040,40320,362880,3628800 }; double sumOfLogAbsoluteErrors = 0; for(int i=0;i> END Factorial.