構文要素に対応するクラス(Expression クラス:式(無限自由モノイド))
<summary>
</summary>
internal class Expression : CodeGeneratable
{
<summary>
</summary>
private readonly IEnumerable<Term> terms;
public Expression(IEnumerable<Term> terms)
{
this.terms = terms;
}
<summary>
</summary>
<param name="term"></param>
<returns></returns>
public static Expression Unit(Term term)
{
return new Expression([term]);
}
<summary>
</summary>
<param name="expression"></param>
<returns></returns>
public Expression Concat(Expression expression)
{
return new Expression(terms.Concat(expression.terms));
}
<summary>
</summary>
<param name="env"></param>
<param name="prog"></param>
<returns></returns>
public FreeMonoid<int> Eval(Env<FreeMonoidUnion> env, Prog prog)
{
IEnumerable<FreeMonoid<int>> monlist = terms.Select(e => e.Eval(env, prog));
return FreeMonoid<int>.Collect(monlist);
}
<summary>
</summary>
<returns></returns>
public string Print()
{
return string.Join(" & ", terms.Select(x => x.Print()));
}
<summary>
</summary>
<param name="yieldp"></param>
<param name="typep"></param>
<param name="indp"></param>
<param name="indcount"></param>
<param name="perf"></param>
<returns></returns>
public string GeneratePython(bool yieldp, bool typep, bool indp, int indcount, Func<string, string> perf)
{
if (yieldp)
{
return Prog.ListGeneratePython(yieldp, typep, indp, indcount, perf, "", terms);
}
else
{
return Prog.ListGeneratePython(yieldp, typep, indp, indcount, perf, " & ", terms);
}
}
<summary>
</summary>
<param name="yieldp"></param>
<param name="typep"></param>
<param name="indp"></param>
<param name="indcount"></param>
<param name="perf"></param>
<returns></returns>
public string GenerateCS(bool yieldp, bool typep, bool indp, int indcount, Func<string, string> perf)
{
if (yieldp)
{
return Prog.ListGenerateCS(yieldp, typep, indp, indcount, perf, "", terms);
}
else
{
return Prog.ListGenerateCS(yieldp, typep, indp, indcount, perf, " & ", terms);
}
}
}
