B<stropped> = 0;
B<sqstring> = 1;
B<dqstring> = 2;
B<NL> = 3;
B<char> = 4;
B<EOF> = 5;
C<immediate> = {
#define INCLUDE_AST_DEBUG "show_ast.c"
int kw(int AST_op, int idx, int ap)
{
int data[4];
int i;
char *k = keyword(idx);
data[1] = idx;
data[2] = A[ap+3]; // index of c[] array element
data[3] = strlen(k);
return mktuple(AST_op, 1, 3, data);
}
// variables used in line_reconstruction() moved here so they are available to semantic code in grammar.
#define STROPPED_KEYWORDS 1 /* alters behaviour of parse() */
int at_startofstatement = TRUE;
int saved = TRUE;
int at_startofline = TRUE;
int in_const_initialiser_list = FALSE;
int in_keyword = FALSE;
int in_alphanumeric = FALSE;
};
P<LABEL-COLON> =
':';
P<SS> =
<EOF>,
<S> <SS>,
<Percent-IU> <CONDITION> <THEN-S> <SS>,
"else" <Percent-IU> <CONDITION> <Opt-start> <S> <SS>,
"else" <Opt-start> <S> <SS>,
"finish" <Opt-ELSE-S> <SS>,
"begin" <S> <SS>,
"end" "of" "perm" <S> <SS>,
"end" "of" "prim" <S> <SS>,
"end" "of" "file" <S> <SS>,
"end" "of" <program> <S> <SS>,
"end" "of" "list" <S> <SS>,
"end" "of" "mcode" <S> <SS>,
"end" <S> <SS>,
<Percent-SEX> <RT> <spec> <NAME> <Opt-ALIAS> <FPP> <S> <SS>,
<Percent-SEX> <RT> <NAME> <Opt-ALIAS> <FPP> <S> <SS>,
<OPT-68K> <Percent-SEX> <RT> <NAME> <Opt-ALIAS> <FPP> <S> <SS>,
<OPT-68K> <XOWN> <XTYPE> <OWNDEC> <S> <SS>,
<OPT-68K> <XTYPE> <DECLN> <S> <SS>,
<OPT-68K> <OPT-XOWN> "record" "array" <RADEC> <REST-OF-RADEC> <S> <SS>,
<OPT-68K> <OPT-XOWN> "record" <RDEC> <REST-OF-RDEC> <S> <SS>,
"const" "char" <NAME> '=' 'C' 'H' 'A' 'R' '<' <INT-CONST> '>' <S> <SS>,
"register" <NAME> '(' <INT-CONST> ')' <S> <SS>,
"record" "format" <RECFMT-spec-OR-BODY> <S> <SS>,
"switch" <ONE-SWITCH-DECL> <REST-OF-SWLIST> <S> <SS>,
"include" <STR-CONST> <S> <SS>,
"option" <STR-CONST> <S> <SS>,
"from" <NAME> "include" <NAME> <Opt-NAME-LIST> <S> <SS>,
"list" <S> <SS>,
"mcode" <S> <SS>,
"trusted" "program" <S> <SS>,
"main" "ep" <NAME> <S> <SS>,
"control" <INT-CONST> <S> <SS>,
"diagnose" <INT-CONST> <S> <SS>,
"reals" "long" <S> <SS>,
"reals" "normal" <S> <SS>,
<COMMENT> <SS>,
'?' '?' <CEXPR> <S> <SS>,
'?' <EXPR> <S> <SS>,
'?' <LVALUE> '=' '=' <EXPR> <S> <SS>,
'?' <LVALUE> '=' <EXPR> <S> <SS>,
<LABEL-DEFINITION> <SS>,
<UI> <REST-OF-SS1> <SS>,
'*' <UCI> <SS>,
"cycle" <Opt-CYCPARM> <S> <SS>,
"repeat" <Opt-UNTIL> <S> <SS>,
<Percent-WUF> "cycle" <S> <SS>,
<Percent-WU> "then" "cycle" <S> <SS>,
<Percent-WU> "then" <UI> <SS>,
"fault" <FAULT-ACTION> <MORE-FAULTS> <S> <SS>,
"on" <OPT-event> <EVENT-LIST> <REST-OF-EVENT-LIST> "start" <S> <SS>,
"spec" <NAME> <FPP> <S> <SS>,
"short" "routine" <S> <SS>,
<!any2char> <char> <SS>;
P<letter> =
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z';
P<digit> =
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9';
P<alphanumeric> =
<letter>,
<digit>;
P<opt-letter-or-digit-seq> =
<letter> <opt-letter-or-digit-seq>,
<digit> <opt-letter-or-digit-seq>,
;
P<program> =
"programme",
"program";
P<outer-level-end> =
"end" "of" <program>,
"end";
P<any2char> =
<immediate: c[cp].t = B_char; return FALSE;>;
P<OPT-68K> =
'@' <68K-stuff>,
;
P<68K-stuff> =
'-' <INT-CONST> '(' <NAME> ')',
<INT-CONST> '(' <NAME> ')',
<INT-CONST> '-' <INT-CONST>,
<INT-CONST>,
'#' <NAME>;
P<spec> =
"specalias",
"spec" <Opt-68K-code-address>;
P<Opt-68K-code-address> =
'(' <INT-CONST> ')',
;
P<OPT-spec> =
<spec>,
;
P<LABEL-DEFINITION> =
<NAME> '(' <CEXPR> ')' <LABEL-COLON>,
<NAME> '(' '*' ')' <LABEL-COLON>,
<NAME> <LABEL-COLON>,
<DIGIT-SEQ> <LABEL-COLON>;
P<FAULT-LIST> =
<DIGIT-SEQ> <MORE-NUMBERS>;
P<MORE-NUMBERS> =
',' <DIGIT-SEQ> <MORE-NUMBERS>,
;
P<FAULT-ACTION> =
<FAULT-LIST> '-' '>' <LABEL>;
P<MORE-FAULTS> =
',' <FAULT-ACTION> <MORE-FAULTS>,
;
P<AUI> =
"and" <UI>,
;
P<OPT-ASSIGN> =
'-' '>' <STRING-RESOLUTION-EXPR>,
<ASSOP-EXPR>,
;
P<UI> =
<LVALUE> <OPT-ASSIGN> <AUI>,
"print" "text" <sqstring> <AUI>,
'-' '>' <LABEL>,
"return",
"true",
"false",
"result" <ASSOP-EXPR>,
"monitorstop",
"monitor" <DIGIT-SEQ> <AUI>,
"monitor" <AUI>,
"stop",
"signal" <OPT-event> <CEXPR> <OPEXPR2>,
"exit",
"continue";
P<LABEL> =
<NAME> '(' <EXPR> ')',
<NAME>,
<DIGIT-SEQ>;
P<OPT-XOWN> =
<XOWN>,
;
P<RADEC> =
<NAME> <Opt-NAME-LIST> <BPAIR> '(' <RECFMT-REF> ')';
P<REST-OF-RADEC> =
',' <RADEC>,
;
P<RDEC> =
<NAME> <Opt-NAME-LIST> '(' <RECFMT-REF> ')';
P<REST-OF-RDEC> =
',' <RDEC> <REST-OF-RDEC>,
;
P<EVENT-LIST> =
'*',
<CEXPR>;
P<Opt-start> =
"start",
;
P<Opt-ELSE-S> =
"else" "start" <S>,
"else" <Percent-IU> <CONDITION> <THEN-S>,
"else" <UI> <S>,
<S>;
P<THEN-S> =
<OPT-then> "start" <S>,
"then" <UI> <Opt-ELSE-S>;
P<OPT-then> =
"then",
;
P<S> =
<NL>,
';';
P<COMMENT> =
"comment" <Parsed-OldStyle-Comment>,
'!' <Parsed-OldStyle-Comment>;
P<Parsed-OldStyle-Comment> =
<char> <Parsed-OldStyle-Comment>,
<dqstring> <Parsed-OldStyle-Comment>,
<sqstring> <Parsed-OldStyle-Comment>,
<letter> <Parsed-OldStyle-Comment>,
<digit> <Parsed-OldStyle-Comment>,
<stropped> <Parsed-OldStyle-Comment>,
<NL>;
P<semi> =
';';
P<INT-CONST> =
<SAVED-INT-CONST>;
P<SAVED-INT-CONST> =
<DIGIT-SEQ> '_' <alphanumeric-SEQ>,
<DIGIT-SEQ>,
<OLDSTYLE-BASE>,
<sqstring>;
P<alphanumeric-SEQ> =
<alphanumeric> <Opt-alphanumeric-SEQ>;
P<Opt-alphanumeric-SEQ> =
<alphanumeric> <Opt-alphanumeric-SEQ>,
;
P<STR-CONST> =
<SAVED-STR-CONST>;
P<SAVED-STR-CONST> =
<OPT-DQ-LETTER> <dqstring>,
<sqstring>;
P<OPT-DQ-LETTER> =
'E',
;
P<NUMERIC-CONST> =
<INT-CONST>,
<REAL-CONST>;
P<CONST> =
<INT-CONST>,
<REAL-CONST>,
<STR-CONST>;
P<OLDSTYLE-BASE> =
<letter> <sqstring>;
P<REAL-CONST> =
<SAVED-REAL-CONST>;
P<DOT> =
'.';
P<OPT-DOT> =
<DOT>,
;
P<SAVED-REAL-CONST> =
<DIGIT-SEQ> <OPT-DOT> <EXPONENT>,
<rest-of-number> <FRACPT> <OPT-EXPONENT>,
<DIGIT-SEQ> '.' <OPT-EXPONENT>;
P<FRACPT> =
'.' <DIGIT-SEQ>;
P<OPT-FRACPT> =
<FRACPT>,
;
P<OPT-Plus-Minus> =
'+',
'-',
;
P<EXPONENT> =
'@' <OPT-Plus-Minus> <DIGIT-SEQ>;
P<OPT-EXPONENT> =
<EXPONENT>,
;
P<DIGIT-SEQ> =
<digit> <rest-of-number>;
P<rest-of-number> =
<DIGIT-SEQ>,
;
P<NAME> =
<letter> <!SQUO-STRING> <opt-letter-or-digit-seq>;
P<SQUO-STRING> =
<sqstring>;
P<UCI> =
<S>,
<char> <UCI>,
<dqstring> <UCI>,
<sqstring> <UCI>,
<stropped> <UCI>;
P<REST-OF-COND> =
"and" <SC> <REST-OF-ANDC>,
"or" <SC> <REST-OF-ORC>,
;
P<REST-OF-ANDC> =
"and" <SC> <REST-OF-ANDC>,
;
P<REST-OF-ORC> =
"or" <SC> <REST-OF-ORC>,
;
P<CONDITION> =
<SC> <REST-OF-COND>;
P<SC> =
<STRING-RESOLUTION>,
<EXPR> <COMP> <EXPR> <OPT-DOUBLE-SIDED>,
<NAME> <OPT-ACTUAL-PARAMETERS>,
'(' <CONDITION> ')',
"not" <SC>;
P<OPT-DOUBLE-SIDED> =
<COMP> <EXPR>,
;
P<STRING-RESOLUTION> =
<LVALUE> '-' '>' <STRING-RESOLUTION-EXPR>;
P<STRING-RESOLUTION-EXPR> =
<STR-MATCH> <OPT-STR-ASSIGN>,
<STR-ASSIGN> <OPT-STR-MATCH>;
P<STRING-LVALUE> =
<LVALUE>;
P<STRING-RVALUE> =
<STRING-LVALUE>,
<STR-CONST>,
'(' <STRING-EXPR> ')';
P<STRING-EXPR> =
<STRING-RVALUE> <REST-OF-STRING-EXPR>;
P<DOTTED-STRING-EXPR> =
<STRING-RVALUE> <?DOT> <REST-OF-STRING-EXPR>;
P<REST-OF-STRING-EXPR> =
'.' <STRING-RVALUE> <REST-OF-STRING-EXPR>,
;
P<STR-MATCH> =
'(' <STRING-EXPR> ')';
P<STR-ASSIGN> =
<STRING-LVALUE>;
P<OPT-STR-ASSIGN> =
'.' <STR-ASSIGN> <OPT-STR-MATCH>,
;
P<OPT-STR-MATCH> =
'.' <STR-MATCH> <OPT-STR-ASSIGN>,
;
P<COMP> =
'=' '=',
'=',
<NOT-EQUALS-ADDRESS>,
<NOT-EQUALS>,
'<' '=',
'<',
'>' '=',
'>';
P<NOT-EQUALS> =
'#',
'\\' '=',
'<' '>';
P<NOT-EQUALS-ADDRESS> =
'#' '#',
'\\' '=' '=';
P<OPT-ACTUAL-PARAMETERS> =
<immediate:return !in_const_initialiser_list;> '(' <EXPR> <REST-OF-ACTUAL-PARAMETERS> ')',
;
P<REST-OF-ACTUAL-PARAMETERS> =
',' <EXPR> <REST-OF-ACTUAL-PARAMETERS>,
;
P<CEXPR> =
<immediate:in_const_initialiser_list = TRUE; return TRUE;> <EXPR> <immediate:in_const_initialiser_list = FALSE; return TRUE;>,
<immediate:in_const_initialiser_list = FALSE; return FALSE;>;
P<EXPR> =
<DOTTED-STRING-EXPR>,
<MEDIUMPREC-EXPR> <REST-OF-EXPR>;
P<REST-OF-EXPR> =
<OP-LOW> <MEDIUMPREC-EXPR> <REST-OF-EXPR>,
;
P<MEDIUMPREC-EXPR> =
<HIGHPREC-EXPR> <REST-OF-MEDIUMPREC-EXPR>;
P<REST-OF-MEDIUMPREC-EXPR> =
<OP-MED> <HIGHPREC-EXPR> <REST-OF-MEDIUMPREC-EXPR>,
;
P<HIGHPREC-EXPR> =
<RIGHT-ASSOC-EXPR> <REST-OF-HIGHPREC-EXPR>;
P<REST-OF-HIGHPREC-EXPR> =
<OP-HIGH-LEFTASSOC> <RIGHT-ASSOC-EXPR> <REST-OF-HIGHPREC-EXPR>,
;
P<RIGHT-ASSOC-EXPR> =
<REST-OF-RIGHTASSOC-EXPR> <UNARY-EXPR>;
P<REST-OF-RIGHTASSOC-EXPR> =
<RIGHTASSOC-EXPR-with-OP> <REST-OF-RIGHTASSOC-EXPR>,
;
P<RIGHTASSOC-EXPR-with-OP> =
<UNARY-EXPR> <OP-HIGH-RIGHTASSOC>;
P<UNARY-EXPR> =
<Opt-UNARY-OP> <OPERAND>;
P<Opt-PARAMETERS-OR-POINTERINDEX> =
<immediate:return !in_const_initialiser_list;> '[' <EXPR> ']',
<immediate:return !in_const_initialiser_list;> '+' '+' <EXPR>,
<immediate:return !in_const_initialiser_list;> '-' '-' <EXPR>,
<OPT-ACTUAL-PARAMETERS>;
P<Opt-RECORDFIELD> =
<immediate:return !in_const_initialiser_list;> '_' <LVALUE>,
;
P<OPERAND> =
<REAL-CONST>,
<INT-CONST>,
<STR-CONST>,
<LVALUE>,
'(' <EXPR> ')',
'|' <EXPR> '|',
'!' <EXPR> '!';
P<OP-HIGH-LEFTASSOC> =
'<' '<',
'>' '>';
P<OP-HIGH-RIGHTASSOC> =
<INTEGER-EXP>,
<REAL-EXP>;
P<INTEGER-EXP> =
'*' '*' '*' '*',
'\\' '\\',
'^' '^';
P<eq> =
'=';
P<REAL-EXP> =
'*' '*',
'\\' <!eq>,
'^';
P<OP-MED> =
'*',
'/' '/',
'/',
'&';
P<OP-LOW> =
'+',
'-',
'!' '!',
'!';
P<Opt-UNARY-OP> =
'+',
'-',
<UNARY-NOT>,
;
P<UNARY-NOT> =
'\\',
'~';
P<Percent-IU> =
"if",
"unless";
P<ONE-SWITCH-DECL> =
<NAME> <Opt-NAME-LIST> '(' <CEXPR> ':' <CEXPR> ')';
P<REST-OF-SWLIST> =
',' <ONE-SWITCH-DECL> <REST-OF-SWLIST>,
;
P<Opt-NAME-LIST> =
',' <NAME> <Opt-NAME-LIST>,
;
P<REST-OF-EVENT-LIST> =
',' <CEXPR> <REST-OF-EVENT-LIST>,
;
P<OPT-event> =
"event",
;
P<FPP> =
'(' <FORMAL-PARAMETER-DECLARATION> <REST-OF-FORMAL-PARAMETER-LIST> ')',
;
P<REST-OF-FORMAL-PARAMETER-LIST> =
<Opt-Comma> <FORMAL-PARAMETER-DECLARATION> <REST-OF-FORMAL-PARAMETER-LIST>,
;
P<FORMAL-PARAMETER-DECLARATION> =
<XTYPE> <OPT-arrayname> <NAME> <OPT-68K-Bounds> <Opt-NAME-LIST>,
<RT> <OPT-name> <NAME> <Opt-NAME-LIST> <FPP>,
"name" <Opt-68K-reg> <NAME> <Opt-NAME-LIST>;
P<Opt-68K-reg> =
'(' <NAME> ')',
;
P<OPT-name> =
"name",
;
P<RT> =
"routine",
"predicate",
<XTYPE> <FN-MAP>;
P<FN-MAP> =
<FN>,
"map";
P<FN> =
"fn",
"function";
P<longlong> =
"long" "long",
"long";
P<BASE-XTYPE> =
"integer",
"real",
"label",
<longlong> <Opt-BTYPE>,
"byte" <Opt-INTEGER>,
"mite" <Opt-INTEGER>,
"short" <Opt-INTEGER>,
"half" <Opt-INTEGER>,
"string" <Opt-STRLEN>,
"record" <Opt-RFREF>;
P<XTYPE> =
<OPT-68K-qualifier> <BASE-XTYPE> <OPT-name>;
P<68K-memptr> =
"read" "only" <68K-memptr>,
"write" "only" <68K-memptr>,
"volatile" <68K-memptr>,
;
P<OPT-68K-qualifier> =
<68K-register>,
<68K-memptr>,
;
P<68K-register> =
"register" '(' <NAME> ')';
P<Opt-RFREF> =
'(' <RECFMT-REF> ')',
'(' '*' ')',
;
P<RECFMT-REF> =
<NAME>,
<RECFMT-DEC> <REST-OF-RECFMT-DEC> <ALT-RECFMT-DEC>;
P<ALT-RECFMT-DEC> =
"or" <RECFMT-DEC> <REST-OF-RECFMT-DEC> <ALT-RECFMT-DEC>,
;
P<REST-OF-RECFMT-DEC> =
',' <RECFMT-DEC> <REST-OF-RECFMT-DEC>,
;
P<RECFMT-DEC> =
<XTYPE> <RECFMT-ELMNT>,
'(' <RECFMT-DEC> <REST-OF-RECFMT-DEC> <ALT-RECFMT-DEC> ')';
P<RECFMT-ELMNT> =
<OPT-arrayname> <NAME> <Opt-NAME-LIST>,
"array" <ADECLN-in-record>;
P<ADECLN-in-record> =
<NAME> <Opt-NAME-LIST> <BPAIR> <REST-OF-ARLIST-in-record>;
P<REST-OF-ARLIST-in-record> =
',' <ADECLN-in-record>,
;
P<LOWERBOUND> =
<EXPR>,
<BASE-XTYPE> <NAME>;
P<UPPERBOUND> =
'*',
<EXPR>,
<BASE-XTYPE> <NAME>;
P<BPAIR> =
'(' <LOWERBOUND> ':' <UPPERBOUND> <REST-OF-BPLIST> ')';
P<BPAIR68K> =
'(' <LOWERBOUND> ':' <UPPERBOUND> <REST-OF-BPLIST68K> ')';
P<REST-OF-BPLIST> =
',' <EXPR> ':' <EXPR> <REST-OF-BPLIST>,
;
P<REST-OF-BPLIST68K> =
',' <LOWERBOUND> ':' <UPPERBOUND> <REST-OF-BPLIST68K>,
;
P<OPT-arrayname> =
"array" <Opt-DIMENSIONS> "name",
"array" <OPT-68K-Bounds> "name",
;
P<Opt-DIMENSIONS> =
'(' <INT-CONST> ')',
;
P<Opt-INTEGER> =
"integer",
;
P<Opt-STRLEN> =
'(' <Opt-STAROREXPR> ')',
;
P<REPEATS> =
'(' <Opt-STAROREXPR> ')',
;
P<Opt-STAROREXPR> =
<STAROREXPR>,
;
P<STAROREXPR> =
<CEXPR>,
'*';
P<Opt-BTYPE> =
"real",
"integer",
"long" "real",
;
P<Opt-Comma> =
',',
;
P<Opt-ALIAS> =
"alias" <TEXTTEXT>,
;
P<TEXTTEXT> =
<dqstring>;
P<Percent-SEX> =
"system",
"external",
"dynamic",
"prim",
"perm",
;
P<RECFMT-spec-OR-BODY> =
"spec" <NAME>,
<NAME> '(' <RECFMT-DEC> <REST-OF-RECFMT-DEC> <ALT-RECFMT-DEC> ')';
P<DECLN> =
<OPT-arrayname> <OPT-spec> <NAME-or-STAR-68K> <OPT-68K-Bounds> <Opt-Init-assign> <Opt-Assign-NAME-LIST>,
"array" <OPT-spec> <OPT-format> <NAME> <Opt-NAME-LIST> <BPAIR> <REST-OF-ARLIST>,
"array" <BPAIR> <OPT-spec> <OPT-format> <NAME> <Opt-NAME-LIST> <REST-OF-ARLIST-68K>;
P<OWNDEC> =
<OPT-arrayname> <OPT-spec> <SINGLE-OWNDEC> <REST-OF-OWNDEC>,
"array" <OPT-format> <OPT-spec> <BPAIR> <NAME> <Opt-Init-assign-array>,
"array" <OPT-format> <OPT-spec> <NAME> <BPAIR> <Opt-Init-assign-array>;
P<REST-OF-ARLIST> =
',' <NAME> <Opt-NAME-LIST> <BPAIR> <REST-OF-ARLIST>,
;
P<REST-OF-ARLIST-68K> =
',' <NAME> <Opt-NAME-LIST> <REST-OF-ARLIST-68K>,
;
P<OPT-68K-Bounds> =
<BPAIR68K>,
;
P<OPT-format> =
"format",
;
P<NAME-or-STAR-68K> =
'*',
<NAME>;
P<Opt-Assign-NAME-LIST> =
',' '*' <Opt-Assign-NAME-LIST>,
',' <NAME> <Opt-Init-assign> <Opt-Assign-NAME-LIST>,
;
P<Opt-Init-assign> =
<ASSOP-EXPR>,
;
P<ASSOP> =
'=' '=',
<SCALAR-ASSIGN>;
P<ASSOP-EXPR> =
'=' '=' <LVALUE>,
<SCALAR-ASSIGN> <EXPR>;
P<LVALUE> =
<NAME> <Opt-PARAMETERS-OR-POINTERINDEX> <Opt-RECORDFIELD>;
P<Opt-Init-assign-array> =
<ASSOP> <stupid> <ARRAY-INITIALISER> <ROCL>,
;
P<Percent-WU> =
"while" <CONDITION>,
"until" <CONDITION>;
P<Percent-WUF> =
"while" <CONDITION>,
"until" <CONDITION>,
"for" <NAME> <SCALAR-ASSIGN> <EXPR> ',' <EXPR> ',' <EXPR>;
P<SCALAR-ASSIGN> =
'=',
'<' '-';
P<Opt-UNTIL> =
"until" <CONDITION>,
;
P<Opt-CYCPARM> =
<NAME> <SCALAR-ASSIGN> <EXPR> ',' <EXPR> ',' <EXPR>,
;
P<OPEXPR2> =
',' <OPT-EXPR> <OPEXPR>,
;
P<OPT-EXPR> =
<EXPR>,
;
P<OPEXPR> =
',' <OPT-EXPR> <OPSTRING>,
;
P<OPSTRING> =
',' <STRING-EXPR>,
;
P<REST-OF-SS1> =
<Percent-IU> <CONDITION> <S>,
<Percent-WUF> <S>,
<S>,
;
P<REST-OF-OWNDEC> =
',' <SINGLE-OWNDEC> <REST-OF-OWNDEC>,
;
P<SINGLE-OWNDEC> =
<NAME> <Opt-ALIAS> <Opt-Init-assign>;
P<ROCL> =
',' <stupid> <ARRAY-INITIALISER> <ROCL>,
;
P<ARRAY-INITIALISER> =
<CEXPR> <REPEATS>;
P<stupid> =
<COMMENT>,
;
P<XOWN> =
"own",
"external",
"extrinsic",
"constant",
"const";
E