diff -r e9bde0aa93ed -r 8da635655f37 stage1_2/iec_bison.yy --- a/stage1_2/iec_bison.yy Tue Jul 29 13:39:40 2014 +0100 +++ b/stage1_2/iec_bison.yy Thu Jul 31 17:49:44 2014 +0100 @@ -414,9 +414,10 @@ %type en_identifier %type eno_identifier -/* Keyword in IEC 61131-3 v3 */ +/* Keywords in IEC 61131-3 v3 */ %token REF %token REF_TO +%token NULL_token /* cannot use simply 'NULL', as it conflicts with the NULL keyword in C++ */ @@ -445,6 +446,23 @@ %type constant %type non_int_or_real_constant +/*********************************/ +/* B 1.2.XX - Reference Literals */ +/*********************************/ +/* NOTE: The following syntax was added by MJS in order to add support for the NULL keyword, defined in IEC 61131-3 v3 + * In v3 expressions that reduce to a reference datatype (REF_TO) are handled explicitly in the syntax + * (e.g., any variable that is a of reference datatpe falls under the 'ref_name' rule), which means + * that we would need to keep track of which variables are declared as REF_TO. + * In order to reduce the changes to the current IEC 61131-3 v2 syntax, I have opted not to do this, + * and simply let the ref_expressions (Ref_Assign, Ref_Compare) be interpreted as all other standard expressions + * in v2. However, ref_expressions allow the use of the 'NULL' constant, which is handled explicitly + * in the ref_expressions syntax of v3. + * To allow the use of the 'NULL' constant in this extended v2, I have opted to interpret this 'NULL' constant + * as a literal. + */ +%type ref_value_null_literal /* defined in IEC 61131-3 v3 - Basically the 'NULL' keyword! */ + + /******************************/ /* B 1.2.1 - Numeric Literals */ /******************************/ @@ -1777,6 +1795,7 @@ * rules, is not defined in the spec! * We therefore replaced unsigned_integer as integer */ +| ref_value_null_literal /* defined in IEC 61131-3 v3. Basically the 'NULL' keyword! */ ; @@ -1808,6 +1827,16 @@ */ ; +/*********************************/ +/* B 1.2.XX - Reference Literals */ +/*********************************/ +/* NOTE: The following syntax was added by MJS in order to add support for the NULL keyword, defined in IEC 61131-3 v3 + * Please read the comment where the 'ref_value_null_literal' is declared as a + */ +/* defined in IEC 61131-3 v3 - Basically the 'NULL' keyword! */ +ref_value_null_literal: + NULL_token {$$ = new ref_value_null_literal_c(locloc(@$));} +; /******************************/ /* B 1.2.1 - Numeric Literals */