<results>

<criterion group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" name="compiles"/>

<criterion group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" name="analyzerOK">
  Analyzer seems to follow specification
  Analyzer seems to check things that are left implicit in specification
</criterion>

<criterion group1="1" group2="0" group3="1" group4="1" group5="1" group6="0" name="analyzerStyle">
  Analyzer is structured around rules - it is easy to see that it does the right thing.
  Does not compute values twice.
  No deep nesting of scopes, separate tasks handled in separate places.
</criterion>

<criterion group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" name="analyzerMessages">
  Error messages display position of error
  The right error messages is displayed
</criterion>

<criterion group1="1" group2="1" group3="1" group4="1" group5="1" group6="0" name="evaluatorOK">
</criterion>

<criterion group1="1" group2="0" group3="1" group4="0" group5="1" group6="0" name="evaluatorStyle">
  Evaluator is structured around small-step / big-step rules - easy to see that it does the
  right thing
</criterion>

<criterion group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" name="bonusImpl"/>

<criterion group1="0" group2="0" group3="0" group4="1" group5="0" group6="1" name="bonusDocu"/>

<remarks group="1">
added tabs with tabcount = 8
fixes another minor bug in parser
small-step evaluation
extension: override (coco_override.fj)

in Evaluator: you should replace
"newE = apply(eval(newE, t), t)"
with
"newE = eval(newE, t)"
it has the same effect but uses less exception handlers.
</remarks>

<remarks group="2">
stupid cast leads to error, not warning (this is reasonable)
big-step evaluation
why do you use substitution in your Analyzer?! use a context!
why do you call analyzer in Evaluator?! use a match on New(C, ...)
</remarks>
<remarks group="3">
added comments //
big-step evaluation
extension: override  (override.fj)

in Evaluator / case Invoke, I suggest you use a binding pattern x @ New(c,args) in order not to construct New(c,args) again for
each occurrence of this in line 64.

Your code is very well commented and very readable, good job.
</remarks>

<remarks group="4">
extension: override (contra.fj)
"hybrid" evaluation -- it's better to choose either small-step or 
big-step. In big-step, one doesn't use congruence rules at all.
In English, the past of "override" is "overridden".
You have some duplicated code as a result of the class table
being realized as a pure data structure (a map). It might
be interesting to make a class out of it.
</remarks>

<remarks group="5">
added comments #
parser returns immutable.Map
big-step evaluation
extension: override (Override_covar_result_contravar_Args.fj

change your comment "//check overload", overloading is different from overriding

your evaluator uses contexts(or: "environments") instead of substitution, that's a good idea.
</remarks>

<remarks group="6">
extension: override (contravariant.fj
</remarks>

<plain  group1="1" group2="0" group3="1" group4="1" group5="0" group6="1" file="group1_cast.fj" />
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="0" file="group1_err_badcast.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group1_override.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group1_pair1.fj"/>
<plain  group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group1_pair2.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group1_point.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group1_simpleFieldAccess.fj"/>
<plain  group1="1" group2="0" group3="1" group4="1" group5="1" group6="0" file="group1_stupidcast.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group1_test4.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="0" group6="0" file="group2_castInside.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group2_empty.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group2_inherit.fj"/>
<plain  group1="1" group2="0" group3="1" group4="1" group5="1" group6="0" file="group5_fact.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group5_If_Lenient.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group5_If_Simple.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group5_test1_cast.fj"/>
<plain  group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="group6_test4.fj"/>


<neg    group1="1" group2="0" group3="0" group4="1" group5="1" group6="0" file="neg0_undefined_variable" />
<neg    group1="1" group2="0" group3="1" group4="1" group5="1" group6="0" file="neg10_class_does_not_exist"/>
<neg    group1="1" group2="0" group3="1" group4="0" group5="1" group6="1" file="neg11_class_does_not_exist"/>
<neg    group1="1" group2="0" group3="0" group4="1" group5="1" group6="0" file="neg12_class_already_declared"/>

<neg    group1="0" group2="0" group3="0" group4="1" group5="1" group6="0" file="neg13_field_already_exists"/>
<neg    group1="0" group2="0" group3="0" group4="1" group5="1" group6="0" file="neg14_class_does_not_exist"/>
<neg    group1="1" group2="1" group3="0" group4="1" group5="1" group6="1" file="neg15_class_does_not_exist"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg16_invalid_override"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg17_invalid_override"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg18_invalid_override"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg19_invalid_override"/>
<neg    group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="neg1a_differs_from_return_type"/>
<neg    group1="1" group2="0" group3="1" group4="1" group5="1" group6="0" file="neg1_undefined_variable"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg2_wrong_number_of_arguments"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg3_wrong_number_of_arguments"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg4_type_mismatch"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg5_class_does_not_exist"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg6_wrong_number_of_arguments"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg7_wrong_number_of_arguments"/>

<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="1" file="neg8_type_mismatch"/>

<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="0" file="neg9_method_does_not_exist"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="0" file="nega_field_does_not_exist"/>
<neg    group1="1" group2="1" group3="1" group4="1" group5="1" group6="0" file="negb_stupidcast"/>
<neg    group1="1" group2="0" group3="0" group4="0" group5="1" group6="0" file="negc_class_does_not_exist"/>
<neg    group1="1" group2="0" group3="1" group4="0" group5="0" group6="0" file="negd_cyclic_inheritance"/>
<neg    group1="1" group2="0" group3="1" group4="0" group5="0" group6="0" file="nege_cyclic_inheritance"/>
<neg    group1="1" group2="0" group3="1" group4="0" group5="0" group6="0" file="negf_cyclic_inheritance"/>


<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group1_coco_override.fj"/>
<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group1_override.fj"/>

<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group3_override.fj"/>
<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group5_Overrride_covar_result1.fj"/>
<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group5_Overrride_covar_result2.fj"/>
<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group5_Overrride_covar_result3.fj"/>
<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group5_Overrride_covar_result3_contravar_Args.fj"/>
<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group5_Overrride_covar_result.fj"/>
<ovride group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group6_contravariant.fj"/>


<orideN group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group3_err2.fj"/>
<orideN group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group4_err_fo.fj"/>
<orideN group1="1" group2="0" group3="1" group4="1" group5="1" group6="1" file="group5_Overrride_err_contravar_restult_covar_Args.fj"/>

</results>
