glob [ #include #include #include // gets a line from standard input // ('gets' and 'fgets' kept crashing for me...) void getline(char* line) { int n=0; while((line[n]=getchar()) != '\n') { n++; } line[n]=0; } main() { int diff; char line[100]; while(1) { getline(line); if(false==SICalculator(&diff, line, strlen(line))) { break; } } } ] parse SICalculator [ top [ int result; ] -> expression[&result] [ printf(":: %d\n", result); return true; ] "exit" [ printf("Wasn't that simple?\n"); return false; ] ] parse expression [in[int* result] top [ int temp; ] every ws[] [ ] tween ws[] [ ] -> product[result] [ ] more-> ("+" product[&temp]) [ *result += temp; ]>more ("-" product[&temp]) [ *result -= temp; ]>more else [ return true; ] ] parse product [in[int* result] top [ int temp1, temp2; ] every ws[] [ ] tween ws[] [ ] -> integer[result] [ return true; ] (integer[&temp1] "*" product[&temp2]) [ *result = temp1 * temp2; return true; ] (integer[&temp1] "/" product[&temp2]) [ *result = temp1 / temp2; return true; ] ] parse integer [in[int* result] anychar[ ] W anychar a anyindex n -> W W[ (n==0 && '0' <= W[n]&&W[n] <= '9') || (n>0 && '1' <= W[n]&&W[n] <= '9') ] cond[a!=0] [ *result = atoi(W); return true; ] ] parse ws [ anychar[] Wo anyindex an -> Wo Wo[ Wo[an]==' ' || Wo[an]=='\t' || Wo[an]=='\n' ] [ return true; ] ]