}
#include "parser_proc.h"
+#undef YYDEBUG
-#define PSI_T_POINTER PSI_T_ASTERISK
-#define PSI_T_LONG_DOUBLE (PSI_T_DOUBLE << 16)
+#define PSI_T_CAST PSI_T_EQUALS
+#define PSI_T_POINTER PSI_T_ASTERISK
+#define PSI_T_LONG_DOUBLE (PSI_T_DOUBLE << 16)
+#define PSI_T_BSLASH (PSI_T_SLASH << 16)
+#define PSI_T_WHITESPACE -PSI_T_NO_WHITESPACE
typedef int token_t;
-static inline int psi_num_exp_op_cmp(token_t op1, token_t op2)
-{
- assert(!op1 || op1 == PSI_T_LPAREN || (op1 <= PSI_T_NOT && op1 >= PSI_T_PIPE));
- assert(!op2 || op2 == PSI_T_LPAREN || (op2 <= PSI_T_NOT && op2 >= PSI_T_PIPE));
-
- if (PSI_T_LPAREN == op2) {
- return -1;
- } else if (PSI_T_LPAREN == op1) {
- return 1;
- } else if (op1 == op2) {
- return 0;
- } else if (!op1) {
- return 1;
- } else if (!op2) {
- return -1;
- }
-
- switch (op1) {
- case PSI_T_PIPE:
- return op2 > PSI_T_PIPE ? 1 : (op2 < PSI_T_PIPE ? -1 : 0);
- case PSI_T_CARET:
- return op2 > PSI_T_CARET ? 1 : (op2 < PSI_T_CARET ? -1 : 0);
- case PSI_T_AMPERSAND:
- return op2 > PSI_T_AMPERSAND ? 1 : (op2 < PSI_T_AMPERSAND ? -1 : 0);
-
- case PSI_T_LSHIFT:
- case PSI_T_RSHIFT:
- return op2 > PSI_T_RSHIFT ? 1 : (op2 < PSI_T_LSHIFT ? -1 : 0);
-
- case PSI_T_PLUS:
- case PSI_T_MINUS:
- return op2 > PSI_T_MINUS ? 1 : (op2 < PSI_T_PLUS ? -1 : 0);
-
- case PSI_T_ASTERISK:
- case PSI_T_SLASH:
- case PSI_T_MODULO:
- return op2 > PSI_T_MODULO ? 1 : (op2 < PSI_T_ASTERISK ? -1 : 0);
-
- case PSI_T_NOT:
- case PSI_T_TILDE:
- return op2 > PSI_T_TILDE ? 1 : (op2 < PSI_T_NOT ? -1 : 0);
- }
-
- return 0;
-}
-
static inline size_t psi_t_alignment(token_t t)
{
#define PSI_ALIGNOF(T) case PSI_T_## T: return ALIGNOF_## T ##_T;
struct psi_token {
token_t type;
- unsigned size, line, col;
+ unsigned size, line, col, flags;
char *text, *file;
char buf[1];
};
struct psi_parser;
-struct psi_token *psi_token_alloc(struct psi_parser *P);
+struct psi_token *psi_token_init(token_t token_typ, const char *token_txt,
+ size_t token_len, unsigned col, unsigned line, const char *file);
size_t psi_token_alloc_size(size_t token_len, size_t fname_len);
struct psi_token *psi_token_copy(struct psi_token *src);
-struct psi_token *psi_token_cat(unsigned argc, ...);
-struct psi_token *psi_token_append(struct psi_token *T, unsigned argc, ...);
+void psi_token_copy_ctor(struct psi_token **src);
+struct psi_token *psi_token_cat(const char *sep, unsigned argc, ...);
+struct psi_token *psi_token_prepend(const char *sep, struct psi_token *T, unsigned argc, ...);
+struct psi_token *psi_token_append(const char *sep, struct psi_token *T, unsigned argc, ...);
struct psi_token *psi_token_translit(struct psi_token *T, char *from, char *to);
uint64_t psi_token_hash(struct psi_token *t, char *digest_buf);
+void psi_token_dump(int fd, struct psi_token *t);
+void psi_token_free(struct psi_token **token);
#endif