From 9e09767e23a4edb6b31540195bfe885f83e080d7 Mon Sep 17 00:00:00 2001 From: bd Date: Tue, 28 Jan 2025 14:39:47 -0500 Subject: [Ongoing] Rewrite frontend to use Flex/Bison This is a merge of another experiment, so the changes are large: - separated "modules" directory into frontend/backend - adjusted module names and moved files for this to happen - removed modules lexer & parser - removed all the unit tests (most were outdated) - added Bison, flex, and C development tools to manifest.scm - added lexer.l, a source file used by the flex utility with a functioning lexing implementation - added parser.y, a source file used by the bison utility with a functioning parser implementation - added node.c and node.h, which parser.y uses to construct an AST of a C source file (up to binary ops) - added driver.c, a Guile-C interface that provides a module to scheme programs - added a Makefile to make all of this - added stuff to .gitignore --- src/frontend/lexer.l | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/frontend/lexer.l (limited to 'src/frontend/lexer.l') diff --git a/src/frontend/lexer.l b/src/frontend/lexer.l new file mode 100644 index 0000000..5b72086 --- /dev/null +++ b/src/frontend/lexer.l @@ -0,0 +1,47 @@ +/*** definition section ***/ +%{ + /* C to be copied verbatim */ + #include "parser.h" +%} + +/* read only one input file */ +%option noyywrap +%option yylineno + +DIGIT [0-9] +ALPHA [[:alpha:]_] + +/*** rules section ***/ +%% + +"(" {return L_PAREN;} +")" {return R_PAREN;} +"{" {return L_BRACK;} +"}" {return R_BRACK;} +";" {return SEMI_COL;} +"~" {return COMP;} +"*" {return MULT;} +"/" {return DIV;} +"%" {return MOD;} +"-" {return MINUS;} +"+" {return PLUS;} + +"int" {return INT;} +"void" {return VOID;} +"return" {return RET;} + +{DIGIT}+ {yylval.ival = atol(yytext); return NUMBER;} +{ALPHA}+ { + yylval.sval = strdup(yytext); + return WORD; + } + +[[:space:]]+ {/* discard */} +. { + printf("Error at line %d: unrecognized symbol \"%s\"\n", yylineno, yytext); + return YYerror; +} + +%% + +/*** C section ***/ -- cgit v1.2.3