]> pd.if.org Git - pdutils/blobdiff - utils/sh/main.c
added grammar and parser files for sh
[pdutils] / utils / sh / main.c
diff --git a/utils/sh/main.c b/utils/sh/main.c
new file mode 100644 (file)
index 0000000..c956e10
--- /dev/null
@@ -0,0 +1,101 @@
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "gram.h"
+#include "tok.h"
+#include "lemon.h"
+#include "parser.h"
+
+struct reserved {
+       char word[16];
+       int token;
+};
+
+               /* not quite reserved, but will fallback to WORD in the grammar */
+static struct reserved rwords[] = {
+       { "case", TOKEN_Case }
+       ,{ "esac", TOKEN_Esac }
+       ,{ "in", TOKEN_In }
+       ,{ "if", TOKEN_If }
+       ,{ "then", TOKEN_Then }
+       ,{ "else", TOKEN_Else }
+       ,{ "elif", TOKEN_Elif }
+       ,{ "fi", TOKEN_Fi }
+       ,{ "do", TOKEN_Do }
+       ,{ "done", TOKEN_Done }
+       ,{ "while", TOKEN_While }
+       ,{ "until", TOKEN_Until }
+       ,{ "for", TOKEN_For }
+       ,{ "!", TOKEN_Bang }
+       ,{ "}", TOKEN_Rbrace }
+       ,{ "{", TOKEN_Lbrace }
+       ,{ "",0 }
+};
+
+static int is_name(char *word) {
+       int i;
+       if (isdigit(word[0])) {
+               return 0;
+       }
+       for (i=0;word[i];i++) {
+               if (word[i] != '_' && !isalnum(word[i])) {
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+static int is_reserved(char *word) {
+       int i;
+       for (i=0;rwords[i].token;i++) {
+               fprintf(stderr, "checking rword %s ?= %s\n", word, rwords[i].word);
+               if (!strcmp(word, rwords[i].word)) {
+                       fprintf(stderr, "matched\n");
+                       return rwords[i].token;
+               }
+       }
+       return 0;
+}
+
+int main(void) {
+       void* parser;
+       struct token_state ts;
+       struct token token;
+       int type, rtype;
+
+       struct parser_state pstate;
+       pstate.casewords = 0;
+       pstate.incase = 0;
+
+               parser = ParseAlloc(malloc);
+       ts_init(&ts, stdin);
+       ParseTrace(stderr, "par: ");
+       while(type = get_token(&ts, &token)) {
+               rtype = 0;
+               if (type == EOF) break;
+               if (token.type == TOKEN_WORD) {
+                       rtype = is_reserved(token.text);
+                       if (!rtype && is_name(token.text) && 0) {
+                               rtype = TOKEN_NAME;
+                       }
+               }
+               if (rtype) {
+                       token.rtype = rtype;
+               } else {
+                       token.rtype = token.type;
+               }
+
+               fprintf(stderr, "feeding type %d\n", token.rtype);
+               
+               Parse(parser, token.rtype, &token, &pstate);
+       }
+       Parse(parser, 0, &token, &pstate);
+
+       /* First input: 
+       15 / 5
+                               */
+       ParseFree(parser, free );
+
+       return 0;
+}