feat: Add boolean literal and comparable binary operators

This commit is contained in:
Lucàs
2024-07-09 17:13:51 +02:00
parent 332dd73f15
commit b493c77d70
5 changed files with 64 additions and 4 deletions
+11 -1
View File
@@ -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) }
+21 -1
View File
@@ -5,6 +5,7 @@ open Syntax
%token <int> INT
%token <float> FLOAT
%token <char> CHARACTER
%token <bool> BOOLEAN
%token <string> STRING
%token <string> 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) }
| 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) }
+21 -1
View File
@@ -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"
+1 -1
View File
@@ -1 +1 @@
'a';
!vrai;
+10
View File
@@ -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