#include #include #include #include "figure2-15-calc.h" #include "grammar.h" char *scanToken(char *ptr, char *lastchar, int *token_type, int *token_value, struct ParseState *PS); extern int nodecount; char *scanToken(char *ptr, char *lastchar, int *token_type, int *token_value, struct ParseState *ParseState) { char *start = ptr; while(ptr < lastchar) { /*!re2c re2c:define:YYCTYPE = "char"; re2c:define:YYLIMIT = lastchar; re2c:define:YYCURSOR = ptr; re2c:yyfill:enable = 0; re2c:indent:top = 1; "+" { *token_type = PLUS; *token_value = nodecount; // printf("node%d [label=\"+\"];\n",nodecount); // nodecount++; return(ptr); } "-" { *token_type = MINUS; *token_value = nodecount; // printf("node%d [label=\"-\"];\n",nodecount); // nodecount++; return(ptr); } "/" { *token_type = DIVIDE; *token_value = nodecount; // printf("node%d [label=\"/\"];\n",nodecount); // nodecount++; return(ptr); } "*" { *token_type = MULTIPLY; *token_value = nodecount; // printf("node%d [label=\"*\"];\n",nodecount); // nodecount++; return(ptr); } "(" { *token_type = LPAREN; *token_value = nodecount; // printf("node%d [label=\"(\"];\n",nodecount); // nodecount++; return(ptr); } ")" { *token_type = RPAREN; *token_value = nodecount; // printf("node%d [label=\")\"];\n",nodecount); // nodecount++; return(ptr); } ":=" { *token_type = ASSIGN; *token_value = nodecount; // printf("node%d [label=\":=\"];\n",nodecount); // nodecount++; return(ptr); } "read" { *token_type = READ; *token_value = nodecount; // printf("node%d [label=read];\n",nodecount); // nodecount++; return(ptr); } "write" { *token_type = WRITE; *token_value = nodecount; // printf("node%d [label=write];\n",nodecount); // nodecount++; return(ptr); } [0-9]+ { *token_type = NUMBER; *token_value = nodecount; // char *x = strndup(start,(size_t)(ptr-start)); // printf("node%d [label=\"number(%s)\"];\n",nodecount,x); // free(x); // nodecount++; return(ptr); } [a-zA-Z]+ { *token_type = ID; *token_value = nodecount; // char *x = strndup(start,(size_t)(ptr-start)); // printf("node%d [label=\"id(%s)\"];\n",nodecount,x); // free(x); // nodecount++; return(ptr); } [ \t] { ++start; continue; } [^] { ParseState->linecount++; ++start; continue; } */ } *token_type = 0; *token_value = nodecount; return(lastchar); }