Hi,
I have a situation where a recursive datatype has a number of declarations, including type constructors. Yet when I try to use those same constructors for further declaration within the datatype, the compiler does not recognize them. Yet top-level recognizes them.
I am using PolyML for a rapid prototyping environment. I suspect a problem with PolyML 4.13, but probably I have blundered. Below is a snippet of the code which displays the behavior, which is also shown.
The compiler does not have a problem with "NUM," but has problems with "LBRACKET" and "LBRACKET," when declaring type "lbr_num_rbr_o." Note that top-level recognizes the constructors in question, after the compiler fails.
I always start the compiler fresh after each error.
Best Regards,
Byron
Simplified code:
datatype type_specifierK = INT | VOID and relopK = LE | LT | GT | GE | EQ | NE and addopK = PLUS | MINUS and mulopK = TIMES | OVER and arithopK = addopK | mulopK and tokenK = ENDFILE | ERROR | ELSE | IF | RETURN | WHILE | ID | NUM | ASSIGN | SEMI | COMMA | LPAREN | RPAREN | LBRACKET | RBRACKET | LCURLY | RCURLY | arithopK | relopK | type_specifierK withtype lbr_num_rbr_o = (LBRACKET * NUM * RBRACKET) option ;
Upon loading the above into PolyML 4.13, the following results are obtained:
datatype type_specifierK = INT | VOID
and relopK = LE | LT |GT | GE | EQ | NE and addopK = PLUS | MINUS and mulopK = TIMES | OVER and arithopK = addopK | mulopK and tokenK = ENDFILE | ERROR | ELSE | IF | RETURN | WHILE | ID | NUM | ASSIGN | SEMI | COMMA | LPAREN | RPAREN | LBRACKET | RBRACKET | LCURLY |RCURLY | arithopK | relopK| type_specifierK withtype lbr_num_rbr_o = (LBRACKET * NUM * RBRACKET) option ; # # # # # # # # # # # Error: Type constructor (RBRACKET) has not been declared Found near datatype type_specifierK = INT | VOID and relopK = LE | LT | GT | ... and addopK = PLUS | MINUS and mulopK = TIMES | ... and arithopK = ... and ... withtype lbr_num_rbr_o = (LBRACKET * NUM * RBRACKET) option
Error: Type constructor (LBRACKET) has not been declared Found near datatype type_specifierK = INT | VOID and relopK = LE | LT | GT | ... and addopK = PLUS | MINUS and mulopK = TIMES | ... and arithopK = ... and ... withtype lbr_num_rbr_o = (LBRACKET * NUM * RBRACKET) option
Static errors (pass2)
;
NUM;
val it = NUM : tokenK
LBRACKET;
val it = LBRACKET : tokenK
RBRACKET;
val it = RBRACKET : tokenK
Please let me know your conclusions.
Thanks,
Byron Hale
Byron Hale wrote:
The compiler does not have a problem with "NUM," but has problems with "LBRACKET" and "LBRACKET," when declaring type "lbr_num_rbr_o." Note that top-level recognizes the constructors in question, after the compiler fails.
Simplified code:
datatype type_specifierK = INT | VOID and relopK = LE | LT | GT | GE | EQ | NE and addopK = PLUS | MINUS and mulopK = TIMES | OVER and arithopK = addopK | mulopK and tokenK = ENDFILE | ERROR | ELSE | IF | RETURN | WHILE | ID | NUM | ASSIGN | SEMI | COMMA | LPAREN | RPAREN | LBRACKET | RBRACKET | LCURLY | RCURLY | arithopK | relopK | type_specifierK withtype lbr_num_rbr_o = (LBRACKET * NUM * RBRACKET) option ;
This won't work. Your datatype definition is creating LBRACKET, NUM and RBRACKET as value constructors but in the withtype part you're trying to use them as type constructors. You must have declared NUM previously as a type constructor. When I try your example NUM is also reported as an undeclared type constructor.
Regards, David.