From 332dd73f153b197a1b860d952b7f9e9b583f944d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= <86352901+LucasVbr@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:57:13 +0200 Subject: [PATCH] Feat: Add Character, String and float literals --- lib/analyzer/lexer.mll | 20 ++++++++++++++------ lib/analyzer/parser.mly | 11 +++++++++++ lib/analyzer/typing.ml | 2 +- lib/syntax/Expressions.ml | 2 ++ test/ressources/test.🥐 | 34 +--------------------------------- test/syntax/TestExpressions.ml | 3 +++ 6 files changed, 32 insertions(+), 40 deletions(-) diff --git a/lib/analyzer/lexer.mll b/lib/analyzer/lexer.mll index bc3fe10..9c1dd67 100644 --- a/lib/analyzer/lexer.mll +++ b/lib/analyzer/lexer.mll @@ -40,20 +40,28 @@ rule token = parse (* Literals *) | interger as i { INT (int_of_string i) } -(* | float as f { FLOAT (float_of_string f) } *) + | float as f { FLOAT (float_of_string f) } + | '"' { Buffer.clear buffer; STRING(string lexbuf) } + | "''" { NULL } + | "'\\''" { CHARACTER '\'' } + | "'\\n'" { CHARACTER '\n' } + | "'\\t'" { CHARACTER '\t' } + | "'\\\\'" { CHARACTER '\\' } + | "'\\r'" { CHARACTER '\r' } + | "'\\b'" { CHARACTER '\b' } + | "'" [^'\\'] "'" { CHARACTER (String.get (Lexing.lexeme lexbuf) 1) } (* Identifiers *) - (* ... *) + | identifier as lxm { IDENTIFIER(lxm) } | eof { EOF } | _ as c { raise (Error c) } and string = parse - | '"' { token lexbuf } + | '\"' { Buffer.contents buffer} + | "\\\"" { Buffer.add_char buffer '"'; string lexbuf } | '\\' { Buffer.add_char buffer '\\'; string lexbuf } - | '\n' { Buffer.add_char buffer '\n'; string lexbuf } - | eof { raise (Error '"') } - | _ { Buffer.add_char buffer (Lexing.lexeme_char lexbuf 0); string lexbuf } + | _ as c { Buffer.add_char buffer c; string lexbuf } and line_comment = parse | '\n' { Lexing.new_line lexbuf; token lexbuf } diff --git a/lib/analyzer/parser.mly b/lib/analyzer/parser.mly index 14afcaf..752ea9b 100644 --- a/lib/analyzer/parser.mly +++ b/lib/analyzer/parser.mly @@ -3,6 +3,12 @@ open Syntax %} %token INT +%token FLOAT +%token CHARACTER +%token STRING +%token IDENTIFIER +%token NULL + %token PLUS "+" %token MINUS "-" %token TIMES "*" @@ -36,12 +42,17 @@ statement: expression: | literal { Expressions.Literal($1) } + | IDENTIFIER { Expressions.Identifier($1) } | unary_expression { $1 } | binary_expression { $1 } | "(" expression ")" { $2 } literal: | INT { Literals.Integer($1) } + | FLOAT { Literals.Float($1) } + | CHARACTER { Literals.Character($1) } + | STRING { Literals.String($1) } + | NULL { Literals.Null } unary_expression: | "-" expression %prec UMINUS { Expressions.UnaryExpression(UnaryOperators.ArithmeticNegation, $2) } diff --git a/lib/analyzer/typing.ml b/lib/analyzer/typing.ml index 3ac320c..c23a5fe 100644 --- a/lib/analyzer/typing.ml +++ b/lib/analyzer/typing.ml @@ -1 +1 @@ -type environment = { variables : (string * _type) list } \ No newline at end of file +type environment = { variables : (string * Types.types) list } \ No newline at end of file diff --git a/lib/syntax/Expressions.ml b/lib/syntax/Expressions.ml index faf675d..dcfade7 100644 --- a/lib/syntax/Expressions.ml +++ b/lib/syntax/Expressions.ml @@ -4,6 +4,7 @@ open BinaryOperators type expressions = | Literal of literals + | Identifier of string | UnaryExpression of unary_operators * expressions | BinaryExpression of binary_operators * expressions * expressions @@ -11,6 +12,7 @@ let rec pp_expressions = function | Literal l -> let pp_l = pp_literals l in Printf.sprintf "Literal(%s)" pp_l + | Identifier i -> Printf.sprintf "Identifier(\"%s\")" i | UnaryExpression (op, e) -> let pp_op = pp_unary_operators op and pp_e = pp_expressions e in Printf.sprintf "UnaryExpression(%s, %s)" pp_op pp_e diff --git a/test/ressources/test.🥐 b/test/ressources/test.🥐 index ed0ba9f..c63591a 100644 --- a/test/ressources/test.🥐 +++ b/test/ressources/test.🥐 @@ -1,33 +1 @@ -1 + 1; -4 * 0; - -/* - -Root( - SequenceStatement( - ExpressionStatement( - BinaryExpression( - Add, - Literal( - Integer(1) - ), - Literal( - Integer(1) - ) - ) - ), - ExpressionStatement( - BinaryExpression( - Multiply, - Literal( - Integer(4) - ), - Literal( - Integer(0) - ) - ) - ) - ) -) - -*/ \ No newline at end of file +'a'; \ No newline at end of file diff --git a/test/syntax/TestExpressions.ml b/test/syntax/TestExpressions.ml index b8ca19c..2022928 100644 --- a/test/syntax/TestExpressions.ml +++ b/test/syntax/TestExpressions.ml @@ -7,6 +7,9 @@ let test_pp_expressions () = ( "Should return \"Literal(...)\"", "Literal(Integer(1))", Expressions.Literal (Literals.Integer 1) ); + ( "Should return \"Identifier(...)\"", + "Identifier(\"myVar\")", + Expressions.Identifier "myVar" ); ( "Should return \"UnaryExpression(...)\"", "UnaryExpression(ArithmeticNegation, Literal(Integer(2)))", Expressions.UnaryExpression