diff --git a/lib/analyzer/lexer.mll b/lib/analyzer/lexer.mll index 9c1dd67..77fe331 100644 --- a/lib/analyzer/lexer.mll +++ b/lib/analyzer/lexer.mll @@ -34,9 +34,19 @@ rule token = parse | '-' { MINUS } | '*' { TIMES } | '/' { DIV } + | "==" { EQUAL_EQUAL } + | "!=" { NOT_EQUAL } + | "<" { LESS_THAN } + | "<=" { LESS_THAN_EQUAL } + | ">" { GREATER_THAN } + | ">=" { GREATER_THAN_EQUAL } + | "&&" { AMPERSAND_AMPERSAND } + | "||" { BAR_BAR } + | "!" { EXCLAMATION } (* Keywords *) - (* ... *) + | "vrai" { BOOLEAN(true) } + | "faux" { BOOLEAN(false) } (* Literals *) | interger as i { INT (int_of_string i) } diff --git a/lib/analyzer/parser.mly b/lib/analyzer/parser.mly index 752ea9b..42c8ea6 100644 --- a/lib/analyzer/parser.mly +++ b/lib/analyzer/parser.mly @@ -5,6 +5,7 @@ open Syntax %token INT %token FLOAT %token CHARACTER +%token BOOLEAN %token STRING %token IDENTIFIER %token NULL @@ -13,6 +14,15 @@ open Syntax %token MINUS "-" %token TIMES "*" %token DIV "/" +%token EQUAL_EQUAL "==" +%token NOT_EQUAL "!=" +%token LESS_THAN "<" +%token LESS_THAN_EQUAL "<=" +%token GREATER_THAN ">" +%token GREATER_THAN_EQUAL ">=" +%token AMPERSAND_AMPERSAND "&&" +%token BAR_BAR "||" +%token EXCLAMATION "!" %token SEMICOLON ";" @@ -50,15 +60,25 @@ expression: literal: | INT { Literals.Integer($1) } | FLOAT { Literals.Float($1) } + | BOOLEAN { Literals.Boolean($1) } | CHARACTER { Literals.Character($1) } | STRING { Literals.String($1) } | NULL { Literals.Null } unary_expression: | "-" expression %prec UMINUS { Expressions.UnaryExpression(UnaryOperators.ArithmeticNegation, $2) } + | "!" expression { Expressions.UnaryExpression(UnaryOperators.LogicalNegation, $2) } binary_expression: | expression "+" expression { Expressions.BinaryExpression (BinaryOperators.Add, $1, $3) } | expression "-" expression { Expressions.BinaryExpression (BinaryOperators.Subtract, $1, $3) } | expression "*" expression { Expressions.BinaryExpression (BinaryOperators.Multiply, $1, $3) } - | expression "/" expression { Expressions.BinaryExpression (BinaryOperators.Divide, $1, $3) } \ No newline at end of file + | expression "/" expression { Expressions.BinaryExpression (BinaryOperators.Divide, $1, $3) } + | expression "==" expression { Expressions.BinaryExpression (BinaryOperators.Equals, $1, $3) } + | expression "!=" expression { Expressions.BinaryExpression (BinaryOperators.NotEquals, $1, $3) } + | expression "<" expression { Expressions.BinaryExpression (BinaryOperators.LessThan, $1, $3) } + | expression "<=" expression { Expressions.BinaryExpression (BinaryOperators.LessThanEquals, $1, $3) } + | expression ">" expression { Expressions.BinaryExpression (BinaryOperators.GreaterThan, $1, $3) } + | expression ">=" expression { Expressions.BinaryExpression (BinaryOperators.GreaterThanEquals, $1, $3) } + | expression "&&" expression { Expressions.BinaryExpression (BinaryOperators.And, $1, $3) } + | expression "||" expression { Expressions.BinaryExpression (BinaryOperators.Or, $1, $3) } \ No newline at end of file diff --git a/lib/syntax/BinaryOperators.ml b/lib/syntax/BinaryOperators.ml index bf2b571..7a83041 100644 --- a/lib/syntax/BinaryOperators.ml +++ b/lib/syntax/BinaryOperators.ml @@ -1,7 +1,27 @@ -type binary_operators = Add | Subtract | Multiply | Divide +type binary_operators = + | Add + | Subtract + | Multiply + | Divide + | Equals + | NotEquals + | LessThan + | LessThanEquals + | GreaterThan + | GreaterThanEquals + | And + | Or let pp_binary_operators = function | Add -> "Add" | Subtract -> "Subtract" | Multiply -> "Multiply" | Divide -> "Divide" + | Equals -> "Equals" + | NotEquals -> "NotEquals" + | LessThan -> "LessThan" + | LessThanEquals -> "LessThanEquals" + | GreaterThan -> "GreaterThan" + | GreaterThanEquals -> "GreaterThanEquals" + | And -> "And" + | Or -> "Or" \ No newline at end of file diff --git a/test/ressources/test.🥐 b/test/ressources/test.🥐 index c63591a..d9a2b18 100644 --- a/test/ressources/test.🥐 +++ b/test/ressources/test.🥐 @@ -1 +1 @@ -'a'; \ No newline at end of file +!vrai; \ No newline at end of file diff --git a/test/syntax/TestBinaryOperators.ml b/test/syntax/TestBinaryOperators.ml index 1346bc0..a31fd1d 100644 --- a/test/syntax/TestBinaryOperators.ml +++ b/test/syntax/TestBinaryOperators.ml @@ -8,6 +8,16 @@ let test_pp_binary_operators () = ("Should return \"Subtract\"", "Subtract", Subtract); ("Should return \"Multiply\"", "Multiply", Multiply); ("Should return \"Divide\"", "Divide", Divide); + ("Should return \"Equals\"", "Equals", Equals); + ("Should return \"NotEquals\"", "NotEquals", NotEquals); + ("Should return \"LessThan\"", "LessThan", LessThan); + ("Should return \"LessThanEquals\"", "LessThanEquals", LessThanEquals); + ("Should return \"GreaterThan\"", "GreaterThan", GreaterThan); + ( "Should return \"GreaterThanEquals\"", + "GreaterThanEquals", + GreaterThanEquals ); + ("Should return \"And\"", "And", And); + ("Should return \"Or\"", "Or", Or); ] in List.iter