Feat: Add Character, String and float literals

This commit is contained in:
Lucàs
2024-07-09 16:57:13 +02:00
parent 2e76ccf9fc
commit 332dd73f15
6 changed files with 32 additions and 40 deletions
+14 -6
View File
@@ -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 }
+11
View File
@@ -3,6 +3,12 @@ open Syntax
%}
%token <int> INT
%token <float> FLOAT
%token <char> CHARACTER
%token <string> STRING
%token <string> 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) }
+1 -1
View File
@@ -1 +1 @@
type environment = { variables : (string * _type) list }
type environment = { variables : (string * Types.types) list }