Skip to content
Snippets Groups Projects
Commit 25ca44c0 authored by Taddeus Kroes's avatar Taddeus Kroes
Browse files

Removed old parser.

parent 8f90e776
No related branches found
No related tags found
No related merge requests found
%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
extern int lineno;
%}
%option noyywrap
word [a-zA-Z0-9$_.]+
int [0-9]+
%%
\n { lineno++; printf("ikmatchhemwel!"); return NEWLINE; }
: { return COLON; }
, { return COMMA; }
#.* { yylval.sval = strdup(yytext); return COMMENT; }
\..* { yylval.sval = strdup(yytext); return DIRECTIVE; }
{word} { yylval.sval = strdup(yytext); return WORD; }
{int}(\({word}\))? { yylval.sval = strdup(yytext); return WORD; }
[ \t]+ ;
%{
#include <stdio.h>
#include <stdlib.h>
// Instruction types
#define TYPE_COMMENT 0
#define TYPE_INLINE_COMMENT 1
#define TYPE_DIRECTIVE 2
#define TYPE_LABEL 3
#define TYPE_CMD 4
typedef struct line {
// Type:
int type;
char *name;
int argc;
char **argv;
struct line *next;
} line;
void yyerror(char *error);
extern int yylex(void);
void add_line(int type, char *name, int argc, char **argv);
char **malloc_args(int argc);
line *first_line, *last_line;
int lineno = 0;
%}
%union {
char *sval;
}
%token <sval> COMMENT DIRECTIVE WORD
%token NEWLINE COMMA COLON
%%
input:
/* Empty */
| input line
;
line:
NEWLINE
| COMMENT NEWLINE { add_line(TYPE_COMMENT, $1, 0, NULL); }
| instruction NEWLINE
| instruction COMMENT NEWLINE { add_line(TYPE_INLINE_COMMENT, $2, 0, NULL); }
;
instruction:
command
| DIRECTIVE { add_line(TYPE_DIRECTIVE, $1, 0, NULL); }
| WORD COLON { add_line(TYPE_LABEL, $1, 0, NULL); }
| error
;
command:
WORD WORD COMMA WORD COMMA WORD {
char **argv = malloc_args(3);
argv[0] = $2;
argv[1] = $4;
argv[2] = $6;
add_line(TYPE_CMD, $1, 3, argv);
}
| WORD WORD COMMA WORD {
char **argv = malloc_args(2);
argv[0] = $2;
argv[1] = $4;
add_line(TYPE_CMD, $1, 2, argv);
}
| WORD WORD {
char **argv = malloc_args(1);
argv[0] = $2;
add_line(TYPE_CMD, $1, 1, argv);
}
;
%%
extern int yylex();
extern int yyparse();
extern FILE *yyin;
/*int main(void) {
return yyparse();
}*/
int 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 *error) {
fprintf(stderr, "Error at line %d: %s\n", lineno, error);
}
void add_line(int type, char *name, int argc, char **argv) {
line *l = (line*)malloc(sizeof(line));
printf("%d: %s\n", lineno, name);
l->argc = argc;
l->argv = argv;
if( last_line == NULL ) {
// First line
first_line = last_line = l;
} else {
// Add line to linked list
last_line = last_line->next = l;
}
}
char **malloc_args(int argc) {
return (char **)malloc(3 * sizeof(char *));
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment