Jayke Meijer 14 лет назад
Родитель
Сommit
1573e9309f
4 измененных файлов с 90 добавлено и 7 удалено
  1. 4 0
      .gitignore
  2. 16 0
      src/Makefile
  3. 7 7
      src/lex.l
  4. 63 0
      src/lex_out.y

+ 4 - 0
.gitignore

@@ -4,3 +4,7 @@
 *~
 *.o
 *.s
+lex.yy.c
+y.tab.c
+y.tab.h
+parser

+ 16 - 0
src/Makefile

@@ -0,0 +1,16 @@
+CC=gcc
+LEX=lex
+YACC=yacc
+CFLAGS=-ll
+
+parser: lex yacc
+	$(CC) -c lex.yy.c y.tab.c
+	$(CC) -o $@ lex.yy.o y.tab.o $(CFLAGS)
+
+lex: lex.l
+	$(LEX) lex.l
+	
+yacc: lex_out.y
+	$(YACC) -d lex_out.y
+
+all: parser

+ 7 - 7
src/lex.l

@@ -5,12 +5,12 @@
 
 %%
 
-[a-z0-9$._]+:       { yylval = yytext; return LABEL; }      /* Label */
-\$[a-z0-9._]        { yylval = yytext; return ARG; }        /* Arg of instr */
-^[a-z.]+            { yylval = yytext; return INSTR; }      /* Instruction */
-\.[^\n]*            { yylval = yytext; return DIRECTIVE; }  /* Assembly */
-\,                  { return COMMA; }                       /* Comma */
-#[^\n]*             { yylval = yytext; return COMMENT; }    /* Comment */
-\n                  { return NL; }                          /* New line */
+[a-z0-9$._]+:       { yylval.sval = yytext; return LABEL; }      /* Label */
+\$[a-z0-9._]        { yylval.sval = yytext; return ARG; }        /* Arg of instr */
+^[a-z.]+            { yylval.sval = yytext; return INSTR; }      /* Instruction */
+\.[^\n]*            { yylval.sval = yytext; return DIRECTIVE; }  /* Assembly */
+[,]                 { return COMMA; }                       /* Comma */
+#[^\n]*             { yylval.sval = yytext; return COMMENT; }    /* Comment */
+[\n]                { return NL; }                          /* New line */
 	
 [\s\t]+             { ; }                              /* Ignore whitespace */

+ 63 - 0
src/lex_out.y

@@ -0,0 +1,63 @@
+%{
+#include <stdio.h>
+#include <stdlib.h>
+void yyerror(char*);
+%}
+
+%token COMMA NL
+
+%union {
+    char *sval;
+}
+
+%token <sval> LABEL
+%token <sval> ARG
+%token <sval> INSTR
+%token <sval> DIRECTIVE
+%token <sval> COMMENT
+
+%%
+symb:
+    LABEL {printf("Found a label: %s\n", $1);}
+    | ARG {printf("Found an argument: %s\n", $1);}
+    | INSTR {printf("Found an instruction: %s\n", $1);}
+    | DIRECTIVE {printf("Found a directive: %s\n", $1);}
+    | COMMA {printf("Found a comma\n");}
+    | COMMENT {printf("Found a comment: %s\n", $1);}
+    | NL {printf("Found a newline\n");}
+    ;
+%%
+
+extern int yylex();
+extern int yyparse();
+extern FILE *yyin;
+
+main(int argc, const char* argv[])
+{
+    if (argc < 2)
+    {
+        printf("No file specified");
+        exit(-1);
+    }
+    
+    // open a file handle to a particular file:
+	FILE *myfile = fopen(argv[1], "r");
+	// make sure it is valid:
+	if (!myfile) {
+		printf("Cannot open %s\n", argv[1]);
+		return -1;
+	}
+	// set lex to read from it instead of defaulting to STDIN:
+	yyin = myfile;
+	
+	// parse through the input until there is no more:
+	do {
+		yyparse();
+	} while (!feof(yyin));
+}
+
+void yyerror(char *s)
+{
+    printf("Found error: %s\n", s);
+    exit(-1);
+}