summaryrefslogtreecommitdiff
path: root/gram.l
diff options
context:
space:
mode:
Diffstat (limited to 'gram.l')
-rw-r--r--gram.l113
1 files changed, 113 insertions, 0 deletions
diff --git a/gram.l b/gram.l
new file mode 100644
index 0000000..95ddf1d
--- /dev/null
+++ b/gram.l
@@ -0,0 +1,113 @@
+%{
+/*
+ * This is a lexical analyzer
+ *
+ * It comes with an associated grammar.
+ *
+ *
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdio.h>
+
+/* header produced from the parser file with '-d' option of yacc */
+#include "y.tab.h"
+
+extern int tee (int);
+#define RETURN(x) return (tee(x))
+
+
+
+const char* ResWords [] = {
+ "type",
+ "name",
+ "brand",
+ 0
+};
+
+const int ResWordsTokens [] = {
+ Y_TYPE,
+ Y_NAME,
+ Y_BRAND
+};
+
+int LineNo = 1;
+
+void
+LexInit ()
+{
+
+#ifdef FLEX_SCANNER
+static void yyrestart (FILE*);
+// yyrestart (0);
+#endif
+ LineNo = 1;
+}
+
+
+int
+CheckResWord (const char* s)
+{
+ const char** pp = ResWords;
+ while (*pp) {
+ if (strcmp (*pp, s) == 0)
+ return pp - ResWords;
+ ++pp;
+ }
+ return -1;
+}
+
+
+%}
+
+
+
+Int [-]?[0-9]+
+Ident [a-zA-Z/\[\]][a-zA-Z.0-9/\[\]]*
+nl [\n]
+sp0 [ \t]*
+sp1 [ \t]+
+
+%%
+
+[:] RETURN (yytext[0]);
+
+\#.*\n { /* comments */
+ ++LineNo;
+ }
+
+\".*\" {
+ char* n = strdup (yytext+1);
+ n[strlen(yytext) - 1] = '\0';
+ yylval.name = n;
+ RETURN (Y_STRING);
+ }
+
+{sp1} {}
+
+{nl} {
+ ++LineNo;
+ RETURN (Y_EOL);
+ }
+
+{Int} {
+ yylval.integer = atoi (yytext);
+ RETURN (Y_INT);
+ }
+
+
+{Ident} {
+ int index = CheckResWord (yytext);
+ if (index >= 0) {
+ RETURN (ResWordsTokens[index]);
+ } else {
+ yylval.name = strdup (yytext);
+ RETURN (Y_ID);
+ }
+ }
+
+. {
+ RETURN (-1);
+ }