lexer: Factor some token inspectors out into new token functions.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 13 Jun 2021 17:33:09 +0000 (10:33 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 13 Jun 2021 20:00:12 +0000 (13:00 -0700)
src/language/lexer/lexer.c
src/language/lexer/token.c
src/language/lexer/token.h

index 817a07baf555f9a3bf479c7640c969439b0394f2..cedbeafd50b21432c24ed376623078ad6c04168a 100644 (file)
@@ -511,15 +511,14 @@ lex_integer (const struct lexer *lexer)
 bool
 lex_next_is_number (const struct lexer *lexer, int n)
 {
-  enum token_type next_token = lex_next_token (lexer, n);
-  return next_token == T_POS_NUM || next_token == T_NEG_NUM;
+  return token_is_number (lex_next (lexer, n));
 }
 
 /* Returns true if the token N ahead of the current token is a string. */
 bool
 lex_next_is_string (const struct lexer *lexer, int n)
 {
-  return lex_next_token (lexer, n) == T_STRING;
+  return token_is_string (lex_next (lexer, n));
 }
 
 /* Returns the value of the token N ahead of the current token, which must be a
@@ -527,21 +526,14 @@ lex_next_is_string (const struct lexer *lexer, int n)
 double
 lex_next_number (const struct lexer *lexer, int n)
 {
-  assert (lex_next_is_number (lexer, n));
-  return lex_next_tokval (lexer, n);
+  return token_number (lex_next (lexer, n));
 }
 
 /* Returns true if the token N ahead of the current token is an integer. */
 bool
 lex_next_is_integer (const struct lexer *lexer, int n)
 {
-  double value;
-
-  if (!lex_next_is_number (lexer, n))
-    return false;
-
-  value = lex_next_tokval (lexer, n);
-  return value > LONG_MIN && value <= LONG_MAX && floor (value) == value;
+  return token_is_integer (lex_next (lexer, n));
 }
 
 /* Returns the value of the token N ahead of the current token, which must be
@@ -549,8 +541,7 @@ lex_next_is_integer (const struct lexer *lexer, int n)
 long
 lex_next_integer (const struct lexer *lexer, int n)
 {
-  assert (lex_next_is_integer (lexer, n));
-  return lex_next_tokval (lexer, n);
+  return token_integer (lex_next (lexer, n));
 }
 \f
 /* Token matching functions. */
@@ -932,8 +923,7 @@ lex_next_token (const struct lexer *lexer, int n)
 double
 lex_next_tokval (const struct lexer *lexer, int n)
 {
-  const struct token *token = lex_next (lexer, n);
-  return token->number;
+  return token_number (lex_next (lexer, n));
 }
 
 /* Returns the null-terminated string in the token N after the current one, in
index 9fa5bbb6ba81804534c809f4a2b90bb552c607cf..61f576ed985b934b43789e2a16912e28f4b595fa 100644 (file)
@@ -198,6 +198,22 @@ token_print (const struct token *token, FILE *stream)
              (int) token->string.length, token->string.string);
   putc ('\n', stream);
 }
+
+bool
+token_is_integer (const struct token *t)
+{
+  return (token_is_number (t)
+          && t->number > LONG_MIN
+          && t->number <= LONG_MAX
+          && floor (t->number) == t->number);
+}
+
+long
+token_integer (const struct token *t)
+{
+  assert (token_is_integer (t));
+  return t->number;
+}
 \f
 void
 tokens_copy (struct tokens *dst, const struct tokens *src)
index b334edfef6c385cdc8a28482198dbb8ce8088a59..6decb1b66b58bdf8b3d7c59d0f88a1bcc03c1c36 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <stdbool.h>
 #include <stdio.h>
+#include "libpspp/assertion.h"
 #include "libpspp/str.h"
 #include "data/identifier.h"
 
@@ -41,6 +42,31 @@ 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;
+}
 \f
 struct tokens
   {