diff options
Diffstat (limited to 'src/lib/syntax.c')
| -rw-r--r-- | src/lib/syntax.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/lib/syntax.c b/src/lib/syntax.c index 89f8be4..395c75e 100644 --- a/src/lib/syntax.c +++ b/src/lib/syntax.c @@ -56,16 +56,20 @@ skip_space(struct scan_state *state) static int single_sym(struct scan_state *state, struct token *token) { - switch(peek(state)){ + uint32_t c; + + c = peek(state); + + switch(c){ case 0x2190: token->tag = TOKEN_TAG_LEFT_ARROW; break; case 0x22C4: token->tag = TOKEN_TAG_DIAMOND; break; case 0x2207: token->tag = TOKEN_TAG_DEL; break; case 0x2336: token->tag = TOKEN_TAG_IBEAM; break; + case 0x2395: token->tag = TOKEN_TAG_QUAD; break; case '\n': token->tag = TOKEN_TAG_NEWLINE; break; case '(': token->tag = TOKEN_TAG_LEFT_PAREN; break; case ')': token->tag = TOKEN_TAG_RIGHT_PAREN; break; - default: - return 0; + default: token->tag = TOKEN_TAG_UNKNOWN_SYM; break; } advance(state); @@ -172,11 +176,11 @@ next_token(struct scan_state *state, struct token *token) { size_t i; int (*scans[])(struct scan_state *, struct token *token) = { - single_sym, identifier, keyword, number, text, + single_sym /* Must be last */ }; skip_space(state); @@ -265,3 +269,22 @@ scan_string(struct aplwc *aplwc, struct string *text, int oneline) return tokens; } + +enum aplwc_rc +check_tokens(struct token_list *tokens) +{ + size_t i; + enum aplwc_rc rc; + + for(i = 0, rc = APLWC_OK; (rc == APLWC_OK) && (i < tokens->length); i++){ + switch(tokens->tokens[i].tag){ + case TOKEN_TAG_UNKNOWN_SYM: + rc = APLWC_INVALID_SYNTAX; + break; + default: + break; + } + } + + return rc; +} |