Look for a LOGO (.LGO) file on the mbed and run the commands in it. Only supports a small subset of the LOGO commands.

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }