aboutsummaryrefslogtreecommitdiff
path: root/lib/syntax/S.ml
diff options
context:
space:
mode:
authorChimrod <>2023-10-06 08:35:56 +0200
committerChimrod <>2023-10-06 08:35:56 +0200
commit97ab5c9a21166f0bffee482210d69877fd6809fa (patch)
treed1fa44000fa07631edc8924a90020f2cfe637263 /lib/syntax/S.ml
parent40f4dbe7844725e0ab07f03f25c35f55b4699b46 (diff)
Moved qparser and syntax in the library folder
Diffstat (limited to 'lib/syntax/S.ml')
-rw-r--r--lib/syntax/S.ml91
1 files changed, 91 insertions, 0 deletions
diff --git a/lib/syntax/S.ml b/lib/syntax/S.ml
new file mode 100644
index 0000000..3873eed
--- /dev/null
+++ b/lib/syntax/S.ml
@@ -0,0 +1,91 @@
+(**
+ This module describe the type an analyzer must implement in order to be
+ used with the parser.
+
+ The module is divided in three modules :
+ - Expression : the finest part of the QSP syntax.
+ - Instruction : if/act block,
+ - Location
+
+ All the elements of the syntax are represented with a dedicated function
+ (instead of a big sum type). The module [Tree] provide an implementation
+ which build the AST.
+
+ *)
+
+type pos = Lexing.position * Lexing.position
+type ('a, 'b) variable = { pos : 'a; name : string; index : 'b option }
+
+(** Represent the evaluation over an expression *)
+module type Expression = sig
+ type 'a obs
+ type repr
+
+ type variable = { pos : pos; name : string; index : repr option }
+ (**
+ Describe a variable, using the name in capitalized text, and an optionnal
+ index.
+
+ If missing, the index should be considered as [0].
+ *)
+
+ val ident : variable -> repr
+
+ (*
+ Basic values, text, number…
+ *)
+
+ val integer : pos -> string -> repr
+ val literal : pos -> string -> repr
+
+ val function_ : pos -> T.function_ -> repr list -> repr
+ (** Call a function. The functions list is hardcoded in lib/lexer.mll *)
+
+ val uoperator : pos -> T.uoperator -> repr -> repr
+ (** Unary operator like [-123] or [+'Text']*)
+
+ val boperator : pos -> T.boperator -> repr -> repr -> repr
+ (** Binary operator, for a comparaison, or an operation *)
+end
+
+module type Instruction = sig
+ type repr
+ type expression
+ type variable
+
+ val call : pos -> string -> expression list -> repr
+ (** Call for an instruction like [GT] or [*CLR] *)
+
+ val location : pos -> string -> repr
+ (** Label for a loop *)
+
+ val comment : pos -> repr
+ (** Comment *)
+
+ val expression : expression -> repr
+ (** Raw expression *)
+
+ type clause = pos * expression * repr list
+
+ val if_ : pos -> clause -> elifs:clause list -> else_:repr list -> repr
+ val act : pos -> label:expression -> repr list -> repr
+ val assign : pos -> variable -> T.assignation_operator -> expression -> repr
+end
+
+module type Location = sig
+ type repr
+ type instruction
+
+ val location : pos -> instruction list -> repr
+end
+
+module type Analyzer = sig
+ module Expression : Expression
+
+ module Instruction :
+ Instruction
+ with type expression = Expression.repr
+ and type variable = Expression.variable
+
+ module Location : Location with type instruction = Instruction.repr
+end