| SEMI
| INTNUM of Word32.word
| IDENT of Symbol.symbol
+ | STRING of string
| RETURN
| PLUS | MINUS | STAR | SLASH | PERCENT | LSH | RSH | LOGOR | LOGAND | BITAND | BITXOR | BITOR | BITNOT | BANG
| ASSIGN | PLUSEQ | MINUSEQ | STAREQ | SLASHEQ | PERCENTEQ | LSHEQ | RSHEQ | BITANDEQ | BITXOREQ | BITOREQ
| LBRACE | RBRACE
| LPAREN | RPAREN
| UNARY | ASNOP (* dummy *)
- | EXTERN | VAR | INT | QUESTION | COLON | COMMA | STRUCT | NULL | LBRACKET | RBRACKET | ARROW | DOT | NEW
+ | EXTERN | VAR | INT | TSTRING | QUESTION | COLON | COMMA | STRUCT | NULL | LBRACKET | RBRACKET | ARROW | DOT | NEW
| PLUSPLUS | MINUSMINUS
%nonterm
| programx function (AUP.append_function programx function)
vtype : INT (T.Int)
+ | TSTRING (T.String)
| IDENT (T.Typedef IDENT)
| vtype STAR (T.Pointer vtype)
| vtype LBRACKET RBRACKET
exp : LPAREN exp RPAREN (exp)
| INTNUM (mark (A.ConstExp(INTNUM),(INTNUMleft,INTNUMright)))
+ | STRING (mark (A.StringExp(STRING),(STRINGleft,STRINGright)))
| IDENT (mark (A.Var(IDENT), (IDENTleft,IDENTright)))
| exp DOT IDENT (mark (A.Member(exp, IDENT), (expleft, IDENTright)))
| exp ARROW IDENT (mark (A.DerefMember(exp, IDENT), (expleft, IDENTright)))