Look for a LOGO (.LGO) file on the mbed and run the commands in it. Only supports a small subset of the LOGO commands.
tokens.cpp@0:864f6ee5169b, 2011-04-09 (annotated)
- Committer:
- nbbhav
- Date:
- Sat Apr 09 18:06:27 2011 +0000
- Revision:
- 0:864f6ee5169b
Initial version supporting FORWARD, BACK, LEFT and RIGHT commands.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nbbhav | 0:864f6ee5169b | 1 | /* |
nbbhav | 0:864f6ee5169b | 2 | * Source file tokenization |
nbbhav | 0:864f6ee5169b | 3 | */ |
nbbhav | 0:864f6ee5169b | 4 | |
nbbhav | 0:864f6ee5169b | 5 | #include <ctype.h> |
nbbhav | 0:864f6ee5169b | 6 | #include <stdlib.h> |
nbbhav | 0:864f6ee5169b | 7 | |
nbbhav | 0:864f6ee5169b | 8 | #include "tokens.h" |
nbbhav | 0:864f6ee5169b | 9 | |
nbbhav | 0:864f6ee5169b | 10 | Token::Token() : type_(UNKNOWN) { |
nbbhav | 0:864f6ee5169b | 11 | } |
nbbhav | 0:864f6ee5169b | 12 | |
nbbhav | 0:864f6ee5169b | 13 | Token::~Token() { |
nbbhav | 0:864f6ee5169b | 14 | if (isWord()) { |
nbbhav | 0:864f6ee5169b | 15 | free(u.word); |
nbbhav | 0:864f6ee5169b | 16 | } |
nbbhav | 0:864f6ee5169b | 17 | } |
nbbhav | 0:864f6ee5169b | 18 | |
nbbhav | 0:864f6ee5169b | 19 | const char* Token::getWord() const { |
nbbhav | 0:864f6ee5169b | 20 | return isWord() ? u.word : NULL; |
nbbhav | 0:864f6ee5169b | 21 | } |
nbbhav | 0:864f6ee5169b | 22 | |
nbbhav | 0:864f6ee5169b | 23 | int Token::getInteger() const { |
nbbhav | 0:864f6ee5169b | 24 | return isInteger() ? u.value : 0; |
nbbhav | 0:864f6ee5169b | 25 | } |
nbbhav | 0:864f6ee5169b | 26 | |
nbbhav | 0:864f6ee5169b | 27 | void Token::get_token(Token* token, const char* str, int* pos) { |
nbbhav | 0:864f6ee5169b | 28 | // Reset state of the token... |
nbbhav | 0:864f6ee5169b | 29 | if (token->isWord()) { |
nbbhav | 0:864f6ee5169b | 30 | free(token->u.word); |
nbbhav | 0:864f6ee5169b | 31 | token->u.word = NULL; |
nbbhav | 0:864f6ee5169b | 32 | } |
nbbhav | 0:864f6ee5169b | 33 | token->type_ = UNKNOWN; |
nbbhav | 0:864f6ee5169b | 34 | |
nbbhav | 0:864f6ee5169b | 35 | // Skip any spaces in the token stream... |
nbbhav | 0:864f6ee5169b | 36 | int i; |
nbbhav | 0:864f6ee5169b | 37 | for (i = *pos; isspace(str[i]); ++i) { |
nbbhav | 0:864f6ee5169b | 38 | } |
nbbhav | 0:864f6ee5169b | 39 | |
nbbhav | 0:864f6ee5169b | 40 | // Now find and return the token... |
nbbhav | 0:864f6ee5169b | 41 | int start = i; |
nbbhav | 0:864f6ee5169b | 42 | if (isalpha(str[i])) { |
nbbhav | 0:864f6ee5169b | 43 | for ( ; isalnum(str[i]); ++i) { |
nbbhav | 0:864f6ee5169b | 44 | } |
nbbhav | 0:864f6ee5169b | 45 | char* word = (char*)malloc(i - start + 1); |
nbbhav | 0:864f6ee5169b | 46 | int k = 0; |
nbbhav | 0:864f6ee5169b | 47 | for (int j = start; j < i; ++j, ++k) { |
nbbhav | 0:864f6ee5169b | 48 | word[k] = toupper(str[j]); |
nbbhav | 0:864f6ee5169b | 49 | } |
nbbhav | 0:864f6ee5169b | 50 | word[k] = 0; |
nbbhav | 0:864f6ee5169b | 51 | |
nbbhav | 0:864f6ee5169b | 52 | token->type_ = WORD; |
nbbhav | 0:864f6ee5169b | 53 | token->u.word = word; |
nbbhav | 0:864f6ee5169b | 54 | } else if (isdigit(str[i])) { |
nbbhav | 0:864f6ee5169b | 55 | int val = str[i] - '0'; |
nbbhav | 0:864f6ee5169b | 56 | for (++i; isdigit(str[i]); ++i) { |
nbbhav | 0:864f6ee5169b | 57 | val *= 10; |
nbbhav | 0:864f6ee5169b | 58 | val += str[i] - '0'; |
nbbhav | 0:864f6ee5169b | 59 | } |
nbbhav | 0:864f6ee5169b | 60 | |
nbbhav | 0:864f6ee5169b | 61 | token->type_ = INTEGER; |
nbbhav | 0:864f6ee5169b | 62 | token->u.value = val; |
nbbhav | 0:864f6ee5169b | 63 | } else if (str[i] == 0) { |
nbbhav | 0:864f6ee5169b | 64 | token->type_ = EOL; |
nbbhav | 0:864f6ee5169b | 65 | } |
nbbhav | 0:864f6ee5169b | 66 | *pos = i; |
nbbhav | 0:864f6ee5169b | 67 | } |