message: Intern file names in msg_location to make them cheaper to copy.
[pspp] / src / language / lexer / token.h
index 8feaf8147298d813ac748c0c9e8134449f91ea09..8ec28f3714ba54046f10c910e6276b2088df6eef 100644 (file)
 #ifndef TOKEN_H
 #define TOKEN_H 1
 
+#include <stdbool.h>
 #include <stdio.h>
+#include "libpspp/assertion.h"
 #include "libpspp/str.h"
 #include "data/identifier.h"
 
-/* A PSPP syntax token.
-
-   The 'type' member is used by the scanner (see scan.h) for SCAN_* values as
-   well, which is why it is not declared as type "enum token_type". */
+/* A PSPP syntax token. */
 struct token
   {
-    int type;                   /* Usually a "enum token_type" value. */
+    enum token_type type;
     double number;
     struct substring string;
   };
 
-#define TOKEN_INITIALIZER(TYPE, NUMBER, STRING) \
-        { TYPE, NUMBER, SS_LITERAL_INITIALIZER (STRING) }
+void token_copy (struct token *, const struct token *);
+void token_uninit (struct token *);
 
-void token_init (struct token *);
-void token_destroy (struct token *);
+bool token_equal (const struct token *, const struct token *);
 
 char *token_to_string (const struct token *);
 
 void token_print (const struct token *, FILE *);
 
+static inline bool token_is_number (const struct token *);
+static inline double token_number (const struct token *);
+bool token_is_integer (const struct token *);
+long token_integer (const struct token *);
+static inline bool token_is_string (const struct token *);
+
+static inline bool
+token_is_number (const struct token *t)
+{
+  return t->type == T_POS_NUM || t->type == T_NEG_NUM;
+}
+
+static inline double
+token_number (const struct token *t)
+{
+  assert (token_is_number (t));
+  return t->number;
+}
+
+static inline bool
+token_is_string (const struct token *t)
+{
+  return t->type == T_STRING;
+}
+
 #endif /* token.h */