summaryrefslogtreecommitdiff
path: root/src/lib/syntax.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/syntax.c')
-rw-r--r--src/lib/syntax.c31
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;
+}