Skip to content
Snippets Groups Projects
Commit 07e57eab authored by Huerkan Utan's avatar Huerkan Utan
Browse files

Initial commit

parents
No related merge requests found
Makefile 0 → 100644
#!/usr/bin/make
.SUFFIXES:
.PHONY: all run pack clean
PCK = lab-3.zip
LEX = flex
TAR = minako
CSRC = minako-syntax.c
LSRC = minako-lexic.l
OBJ = $(LSRC:%.l=%.o) $(CSRC:%.c=%.o)
DEP = $(OBJ:%.o=%.d)
-include $(DEP)
CFLAGS = -std=c11 -Wall -pedantic -MMD -MP -DLEXDEBUG
LFLAGS = -t
%.c: %.l
$(LEX) $(LFLAGS) $< > $@
%.o: %.c
$(CC) $(CFLAGS) -c $<
$(TAR): $(OBJ)
$(CC) $(CFLAGS) $^ -o $@
all: $(TAR)
run: all
./$(TAR) beispiel.c-1
pack:
zip -vj $(PCK) $(CSRC)
clean:
$(RM) $(RMFILES) $(TAR) $(OBJ) $(DEP) $(PCK) $(LSRC:%.l=%.c)
int blub() {
blub1 = 23;
blub2 = 17;
blub3 = 42;
blub4 = blub1 * (blub2 + blub3);
if (blub1 < blub4) return blub2;
return blub3;
}
float blah() {
a = 1;
b = 2;
if (a < blub()) {
if (b > blub()) {
printf(blub() + blub());
}
}
return 3.14159;
}
void main() {
a = 1;
b = 2;
if (a<=b) printf(a+b);
if (a>=b) printf(a-b);
printf(blub());
printf(blah());
}
lab-3.zip 0 → 100644
File added
minako 0 → 100755
File added
This diff is collapsed.
minako-lexic.o: minako-lexic.c minako.h
minako.h:
%option noyywrap
%option nounput
%option yylineno
%option noinput
%option never-interactive
WHITESPACE [[:space:]]
INTEGER [[:digit:]]+
FLOAT {INTEGER}"."{INTEGER}|"."{INTEGER}
%x COMMENT
%{
#include <stdlib.h>
#include "minako.h"
yystype yylval;
%}
%%
{WHITESPACE}+ { /* ignore whitespaces */ }
"//".*\n { /* C++ Comment */ }
"/*" { BEGIN(COMMENT); /* C Comment */ }
<COMMENT>"*/" { BEGIN(INITIAL); }
<COMMENT>"*"[^/]
<COMMENT>[^*]+
"&&" return AND;
"||" return OR;
"==" return EQ;
"!=" return NEQ;
"<=" return LEQ;
">=" return GEQ;
"<" return LSS;
">" return GRT;
"bool" return KW_BOOLEAN;
"do" return KW_DO;
"else" return KW_ELSE;
"float" return KW_FLOAT;
"for" return KW_FOR;
"if" return KW_IF;
"int" return KW_INT;
"printf" return KW_PRINTF;
"return" return KW_RETURN;
"void" return KW_VOID;
"while" return KW_WHILE;
{FLOAT}([eE][\-+]?{INTEGER})? |
{INTEGER}([eE][\-+]?{INTEGER}) {
yylval.floatValue = strtod(yytext, NULL);
return CONST_FLOAT;
}
{INTEGER} {
yylval.intValue = strtol(yytext, NULL, 10);
return CONST_INT;
}
"true" { yylval.intValue = 1; return CONST_BOOLEAN; }
"false" { yylval.intValue = 0; return CONST_BOOLEAN; }
[[:alpha:]][[:alnum:]_]* {
yylval.string = malloc(yyleng + 1);
strcpy(yylval.string, yytext);
return ID;
}
. return yytext[0];
<<EOF>> return EOF;
%%
File added
#include <stdio.h>
#include <stdlib.h>
#include "minako.h"
int currentToken;
int nextToken;
int lineNo;
void s_program();
void s_functionDefinition();
void s_type();
void s_statementList();
void s_functioncall();
void s_block();
void s_statement();
void s_ifStatement();
void s_returnStatement();
void s_printf();
void s_statAssignment();
void s_simpExpr();
void s_expr();
void s_term();
void s_factor();
void s_assignment();
int isToken(int derivedToken) {
if (currentToken == derivedToken)
return 1;
else
return 0;
}
void eat() {
if (nextToken == EOF)
currentToken = nextToken;
else
{
lineNo = yylineno;
currentToken = nextToken;
nextToken = yylex();
}
}
void isTokenAndEat(int derivedToken) {
if (isToken(derivedToken))
eat();
else
{
fprintf(stderr, "ERROR: Syntax error in line %d\n", lineNo);
exit(1);
}
}
void s_program() {
while (!isToken(EOF))
{
s_functionDefinition();
}
}
void s_functionDefinition() {
s_type();
isTokenAndEat(ID);
isTokenAndEat('(');
isTokenAndEat(')');
isTokenAndEat('{');
s_statementList();
isTokenAndEat('}');
}
void s_type() {
if (currentToken == KW_BOOLEAN || currentToken == KW_FLOAT || currentToken == KW_INT || currentToken == KW_VOID)
eat();
else
isTokenAndEat(KW_BOOLEAN);
//will trigger a announcement: invalid syntax
}
void s_statementList() {
while (!isToken('}'))
{
s_block();
}
}
void s_block() {
if (isToken('{'))
{
isTokenAndEat('{');
s_statementList();
isTokenAndEat('}');
}
else
{
s_statement();
}
}
void s_returnStatement() {
isTokenAndEat(KW_RETURN);
if (!isToken(';'))
s_assignment();
}
void s_ifStatement() {
isTokenAndEat(KW_IF);
isTokenAndEat('(');
s_assignment();
isTokenAndEat(')');
s_block();
}
void s_printf() {
isTokenAndEat(KW_PRINTF);
isTokenAndEat('(');
s_assignment();
isTokenAndEat(')');
}
void s_statement() {
switch (currentToken)
{
case (KW_IF):
s_ifStatement();
break;
case (KW_RETURN):
s_printf();
isTokenAndEat(';');
break;
case (ID):
if (nextToken == '=')
{
s_statAssignment();
isTokenAndEat(';');
}
else if (nextToken == '(')
{
s_functioncall();
isTokenAndEat(';');
}
else
{
isTokenAndEat('=');
}
break;
default:
isTokenAndEat(KW_IF);
//will trigger a announcement: invalid syntax
break;
}
}
void s_functioncall() {
isTokenAndEat(ID);
isTokenAndEat('(');
isTokenAndEat(')');
}
void s_statAssignment() {
isTokenAndEat(ID);
isTokenAndEat('=');
s_assignment();
}
void s_assignment() {
if (isToken(ID) && (nextToken == '='))
{
isTokenAndEat(ID);
isTokenAndEat('=');
s_assignment();
}
else
s_expr();
}
void s_expr() {
s_simpExpr();
if (!isToken(')'))
{
if (isToken(EQ) || isToken(NEQ) || isToken(LEQ) || isToken(GEQ) || isToken(LSS) || isToken(GRT))
{
eat();
s_simpExpr();
}
}
}
void s_simpExpr() {
if (isToken('-'))
eat();
s_term();
while (isToken('+') || isToken('-') || isToken(OR))
{
eat();
s_term();
}
}
void s_term() {
s_factor();
while (isToken('*') || isToken('/') || isToken(AND))
{
eat();
s_factor();
}
}
void s_factor() {
if (isToken(CONST_INT) || isToken(CONST_FLOAT) || isToken(CONST_BOOLEAN))
eat();
else {
if (isToken(ID)) {
if (nextToken == '(') {
s_functioncall();
}
else {
isTokenAndEat(ID);
}
}
else {
isTokenAndEat('(');
s_assignment();
isTokenAndEat(')');
}
}
}
int main(int argc, char* argv[]){
if (argc != 2)
yyin = stdin;
else
{
yyin = fopen(argv[1], "r");
if (yyin == 0)
{
fprintf(stderr, "ERROR: Could not open file %s for reading.\n", argv[1]);
exit(-1);
}
}
//init Vlaues
currentToken = yylex();
nextToken = yylex();
s_program();
return 0;
}
minako-syntax.o: minako-syntax.c minako.h
minako.h:
File added
minako.h 0 → 100644
#ifndef MINAKO_H
#define MINAKO_H
#include <stdio.h>
#ifndef YYSTYPE
typedef union {
char *string;
double floatValue;
int intValue;
} yystype;
#define YYSTYPE yystype
#endif
#define AND 257
#define OR 258
#define EQ 259
#define NEQ 260
#define LEQ 261
#define GEQ 262
#define LSS 263
#define GRT 264
#define KW_BOOLEAN 265
#define KW_DO 266
#define KW_ELSE 267
#define KW_FLOAT 268
#define KW_FOR 269
#define KW_IF 270
#define KW_INT 271
#define KW_PRINTF 272
#define KW_RETURN 273
#define KW_VOID 274
#define KW_WHILE 275
#define CONST_INT 276
#define CONST_FLOAT 277
#define CONST_BOOLEAN 278
#define ID 279
extern YYSTYPE yylval;
extern int yylex();
extern FILE *yyin;
extern int yylineno;
#endif
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment