jitters: parse: add parsing module

This commit is contained in:
Bruno BELANYI 2020-09-28 12:37:40 +02:00
parent 34c9ad0189
commit f1a6435969
6 changed files with 158 additions and 1 deletions

View file

@ -5,4 +5,10 @@ EXTRA_DIST = \
bootstrap \ bootstrap \
$(NULL) $(NULL)
# Initialise those variables for use in included files
BUILT_SOURCES =
noinst_LIBRARIES =
# We want to remove those files when `clean` rule is being executed
CLEANFILES = $(BUILT_SOURCES)
include %D%/src/local.am include %D%/src/local.am

View file

@ -1,8 +1,15 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include "parse/parse-jitters.h"
int main(void) int main(void)
{ {
puts("Hello World!"); int res;
yydebug = getenv("PARSE") != NULL;
if (yyparse(&res) == 0) {
printf("%d\n", res);
}
return 0; return 0;
} }

View file

@ -7,3 +7,11 @@ jitters_SOURCES = \
# Add warnings # Add warnings
jitters_CFLAGS = $(WARN_CFLAGS) jitters_CFLAGS = $(WARN_CFLAGS)
jitters_LDFLAGS = $(WARN_LDFLAGS) jitters_LDFLAGS = $(WARN_LDFLAGS)
# Make includes cleaner
AM_CPPFLAGS = -I$(top_builddir)/src -I$(srcdir)
# Initialise those variables for use in included files
jitters_LDADD =
include %D%/parse/local.am

27
src/parse/local.am Normal file
View file

@ -0,0 +1,27 @@
# Do not warn about YACC compatibility, but do output token codes
AM_YFLAGS = -Wno-yacc -d
# Add parsing library to `jitters`
jitters_LDADD += \
libparse.a \
$(NULL)
# Declare library as non-installable
noinst_LIBRARIES += \
libparse.a \
$(NULL)
# Add Flex/Bison sources to parsing library
libparse_a_SOURCES = \
%D%/parse-jitters.y \
%D%/scan-jitters.l \
$(NULL)
# Mark their output files as being built by Flex/Bison
BUILT_SOURCES += \
%D%/parse-jitters.c \
%D%/parse-jitters.h \
%D%/scan-jitters.c \
$(NULL)
# Remove problematic warnings from generated files
libparse_a_CFLAGS = \
-Wno-switch-default \
$(NULL)

64
src/parse/parse-jitters.y Normal file
View file

@ -0,0 +1,64 @@
%{
#include <stdio.h>
int yylex(void);
void yyerror(int *unused,char const *s);
%}
%define api.value.type {int}
%define api.token.prefix {TOK_}
%define parse.error verbose
%define parse.trace true
%parse-param {int *result}
%locations
%token EOF 0 "end-of-file"
%token NUM "number"
%token
PLUS "+"
MINUS "-"
TIMES "*"
DIVIDE "/"
LPAREN "("
RPAREN ")"
%left PLUS MINUS
%left TIMES DIVIDE
%precedence NEG
%%
input:
exp EOF
{ *result = $1; }
;
exp:
NUM
{ $$ = $1; }
| exp PLUS exp
{ $$ = $1 + $3; }
| exp MINUS exp
{ $$ = $1 - $3; }
| exp TIMES exp
{ $$ = $1 * $3; }
| exp DIVIDE exp
{ $$ = $1 / $3; }
| PLUS exp %prec NEG
{ $$ = $2; }
| MINUS exp %prec NEG
{ $$ = -$2; }
| LPAREN exp RPAREN
{ $$ = $2; }
;
%%
void yyerror(int *unused, char const *s)
{
unused = unused; // Unused
fprintf(stderr, "%s\n", s);
}

45
src/parse/scan-jitters.l Normal file
View file

@ -0,0 +1,45 @@
%{
#include "parse-jitters.h"
#define YY_USER_ACTION \
do { \
yylloc.first_line = yylloc.last_line; \
yylloc.first_column = yylloc.last_column; \
for (size_t i = 0; yytext[i] != '\0'; ++i) { \
if (yytext[i] == '\n') { \
yylloc.last_line++; \
yylloc.last_column = 0; \
} \
else { \
yylloc.last_column++; \
} \
} \
} while (0);
%}
/* Assume single input file */
%option noyywrap
/* Let Flex track line number */
%option yylineno
/* Regex shorthands */
blank [ \t\n]+
int [0-9]+
%%
"+" return TOK_PLUS;
"-" return TOK_MINUS;
"*" return TOK_TIMES;
"/" return TOK_DIVIDE;
"(" return TOK_LPAREN;
")" return TOK_RPAREN;
{int} {
yylval = atoi(yytext);
return TOK_NUM;
}
{blank} { /* Do noting */ }
%%