From 0cf05dfd9c77bbb5b2dd2916e11628f0c8f5997e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20LACROIX?= Date: Wed, 12 Apr 2023 23:48:01 +0200 Subject: [PATCH] added files from previous work --- lex.l | 71 +++++++++++++++++++++++++ yacc.y | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 lex.l create mode 100644 yacc.y diff --git a/lex.l b/lex.l new file mode 100644 index 0000000..7d90db3 --- /dev/null +++ b/lex.l @@ -0,0 +1,71 @@ +%{ +#include "y.tab.h" +%} + + +/*options for compiling*/ +%option noyywrap +%option noinput +%option nounput + + + /*definition of the different types of comments*/ +M_COMMENT (\/\/).* +S_COMMENT \/\*(.|\n)*?\*\/ + + + /*definition of the Ids and types of ints*/ +ID [a-zA-Z][a-zA-Z0-9]* +INT_DEC [0-9]+ +INT_HEX 0x[0-9a-fA-F]+ + + +%% + + +"if" return(tIF); +"else" return(tELSE); +"while" return(tWHILE); +"print" return(tPRINT); +"return" return(tRETURN); +"float" return(tFLOAT); +"int" return(tINT); +"void" return(tVOID); +"+" return(tADD); +"-" return(tSUB); +"*" return(tMUL); +"/" return(tDIV); +"<" return(tLT); +">" return(tGT); +"!=" return(tNE); +"==" return(tEQ); +">=" return(tGE); +"<=" return(tLE); +"=" return(tASSIGN); +"&&" return(tAND); +"||" return(tOR); +"!" return(tNOT); +"{" return(tLBRACE); +"}" return(tRBRACE); +"(" return(tLPAR); +")" return(tRPAR); +";" return(tSEMI); +"," return(tCOMMA); + +{ID} return(tID); +{INT_DEC} return(tNB); +{INT_HEX} return(tNB); + + + /*comments are ignored, same for spaces and lines*/ +{M_COMMENT} ; +{S_COMMENT} ; +[ ]+ ; +\n ; + + /*anything else is considered an error*/ +. yyerror(yytext); + +%% + + // SI >> SC diff --git a/yacc.y b/yacc.y new file mode 100644 index 0000000..c07c632 --- /dev/null +++ b/yacc.y @@ -0,0 +1,160 @@ +%define parse.error detailed + +%{ +#include +#include +#include "table.h" +%} + +%code provides { + int yylex (void); + void yyerror (const char *); +} + +// TODO : PROBLEM DOES'NT COMPILE (enumVarType doenst exist) +%union {int nbInt; enumVarType int type; char* string;} + /*loops keywords*/ +%token tWHILE tIF tELSE + /*reserved keywords*/ +%token tRETURN tPRINT + /*types : integers, floats or void*/ +%token tFLOAT tINT tVOID + /*operations*/ +%left tDIV tMUL tADD tSUB + /*Assignment*/ +%left tASSIGN + /*comparisons*/ +%left tLT tGT tNE tEQ tGE tLE + /*boolean operators*/ +%left tAND tOR tNOT + /*syntaxic symbols*/ +%token tLBRACE tRBRACE tLPAR tRPAR tSEMI tCOMMA + + /*nametags and values*/ +%token tID +%token tNB + + + /* represents types with the values used in the table, see table.h */ +%type Type + + +%start Lines +%% + + /* Lines = Any line in the code that is not within an if/while statement*/ + Lines : Line + | Line Lines; + +Line : IfStatement + | WhileStatement + | Assignment + | FunctionDef + | Declaration + | FunctionCall + | Return + | Print; + +/*Innerblock = the inside of an if/else/while statement = { ... } or function = f(){...}*/ +InnerBlock : tLBRACE tRBRACE // a function or while loop can be empty cf GCC + | tLBRACE {increaseDepth();} Lines tRBRACE {decreaseDepth();}; + +/*Condition = the evaluated boolean expression for an if or while = ( ... ) */ +Condition : tLPAR ConditionalExpression tRPAR; + +/*ConditionalExpression = expression that evaluates to a boolean*/ +ConditionalExpression : tID + | tNB + | tLPAR ConditionalExpression tRPAR // for cases like if((a or b) and (a or c)) where there are parenthesis inside + | NbOrVariable NumericalOperator NbOrVariable + | tNOT ConditionalExpression + /* replaced by the two following lines + | ConditionalExpression BinaryLogicalOperator ConditionalExpression + */ + | ConditionalExpression tOR ConditionalExpression + | ConditionalExpression tAND ConditionalExpression; + /*end of added bloat*/ + + +/*NbOrVariable is either a number or a variable of type int*/ +NbOrVariable : tID | tNB; + + /*List of all numerical operators*/ +NumericalOperator : tLE | tGE | tEQ | tNE | tLT | tGT; + + /*any arithmetic operation +Operation: tADD | tMUL | tSUB | tDIV; +*/ + +IfStatement : tIF Condition InnerBlock + | tIF Condition InnerBlock tELSE InnerBlock + +WhileStatement : tWHILE Condition InnerBlock; + +Assignment : tID tASSIGN Expression tSEMI {toggleInit($1);}; + + /*Expression operation applied on variables or values*/ +Expression : NbOrVariable + | FunctionCall + | tLPAR Expression tRPAR + /* replaced by the four following lines + //| Expression Operation Expression + */ + | Expression tADD Expression + | Expression tSUB Expression + | Expression tMUL Expression + | Expression tDIV Expression; + /*end of added bloat*/ + +Expressions : Expression + | Expression tCOMMA Expressions; + +FunctionCall : tID tLPAR Expressions tRPAR; + +FunctionDef : Type tID FunctionParams InnerBlock; + + /*FunctionParams = the parameters of a function*/ +FunctionParams : tLPAR tRPAR + | tLPAR tVOID tRPAR + | tLPAR VarsWithType tRPAR + +VarsWithType : VarWithType + | VarWithType tCOMMA VarsWithType; + + /*VarWithType = a variable associated to its type = int a*/ +VarWithType : Type tID; + + /*the return type or argument type*/ +Type : tINT {$$ = INT;} + | tFLOAT {$$ = FLOAT;}; + +Declaration : Type tID tSEMI {addElement($2, $1);} + | Type tID tASSIGN Expression tSEMI {addElement($2, $1);toggleInit($2);} + +/* Potential improvement : take care of multiple definition on same line*/ + | Type tID tCOMMA VarsCommaSeparated tSEMI {yyerror("[Beta] you cannot -still- define several variable on the same line");} + | Type tID tCOMMA VarsCommaSeparated tASSIGN Expression tSEMI {yyerror("[Beta] you cannot -still- define several variable on the same line");}; + // yes this is perfectly valid in C, the last variable will hold the value, the others won't + + + // this is only used in case of a declaration of several same-typed + // variables, ex : `int a,b,c;` +VarsCommaSeparated : tID + | tID tCOMMA VarsCommaSeparated; + +Return : tRETURN Expression tSEMI {decreaseDepth();}; + +Print : tPRINT tLPAR Expression tRPAR tSEMI; + +%% + +void yyerror(const char *msg) { + fprintf(stderr, "\033[1m\033[31m[/!\\]\033[0m Error : %s\n", msg); + exit(1); +} + +int main(void) { + initSymbolTable(); + yyparse(); +} + // SI >> SC