X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Flexer.c;h=c9966e8c02d0130a40996e813a87704aff6d6657;hb=c3bbd7d1ea59437f69029d239ef616c8aaa453cc;hp=2e6232afdc4ab6bee345ac0a2238e99d28ff6503;hpb=a91180ce13a1d95abed44b0c3cc12c94981bb5d6;p=pspp diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 2e6232afdc..c9966e8c02 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -379,6 +379,14 @@ lex_get (struct lexer *lexer) return; } } + +/* Advances LEXER by N tokens. */ +void +lex_get_n (struct lexer *lexer, size_t n) +{ + while (n-- > 0) + lex_get (lexer); +} /* Issuing errors. */ @@ -564,7 +572,8 @@ lex_next_error_valist (struct lexer *lexer, int n0, int n1, ds_put_cstr (&s, ": "); ds_put_vformat (&s, format, args); } - ds_put_byte (&s, '.'); + if (ds_last (&s) != '.') + ds_put_byte (&s, '.'); msg (SE, "%s", ds_cstr (&s)); ds_destroy (&s); } @@ -1123,32 +1132,49 @@ lex_tokens_match (const struct token *actual, const struct token *expected) } } -/* If LEXER is positioned at the sequence of tokens that may be parsed from S, - skips it and returns true. Otherwise, returns false. - - S may consist of an arbitrary sequence of tokens, e.g. "KRUSKAL-WALLIS", - "2SLS", or "END INPUT PROGRAM". Identifiers may be abbreviated to their - first three letters. */ -bool -lex_match_phrase (struct lexer *lexer, const char *s) +static size_t +lex_at_phrase__ (struct lexer *lexer, const char *s) { struct string_lexer slex; struct token token; - int i; - i = 0; + size_t i = 0; string_lexer_init (&slex, s, strlen (s), SEG_MODE_INTERACTIVE, true); while (string_lexer_next (&slex, &token)) { bool match = lex_tokens_match (lex_next (lexer, i++), &token); token_uninit (&token); if (!match) - return false; + return 0; } + return i; +} - while (i-- > 0) - lex_get (lexer); - return true; +/* If LEXER is positioned at the sequence of tokens that may be parsed from S, + returns true. Otherwise, returns false. + + S may consist of an arbitrary sequence of tokens, e.g. "KRUSKAL-WALLIS", + "2SLS", or "END INPUT PROGRAM". Identifiers may be abbreviated to their + first three letters. */ +bool +lex_at_phrase (struct lexer *lexer, const char *s) +{ + return lex_at_phrase__ (lexer, s) > 0; +} + +/* If LEXER is positioned at the sequence of tokens that may be parsed from S, + skips it and returns true. Otherwise, returns false. + + S may consist of an arbitrary sequence of tokens, e.g. "KRUSKAL-WALLIS", + "2SLS", or "END INPUT PROGRAM". Identifiers may be abbreviated to their + first three letters. */ +bool +lex_match_phrase (struct lexer *lexer, const char *s) +{ + size_t n = lex_at_phrase__ (lexer, s); + if (n > 0) + lex_get_n (lexer, n); + return n > 0; } static int