summaryrefslogtreecommitdiff
path: root/lambda-calcul/java/lcgoji/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/java/lcgoji/src/main')
-rw-r--r--lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/LCEvaluator.java59
-rw-r--r--lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/Main.java49
-rw-r--r--lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Abs.java26
-rw-r--r--lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/App.java22
-rw-r--r--lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Term.java5
-rw-r--r--lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Var.java21
-rw-r--r--lambda-calcul/java/lcgoji/src/main/resources/log4j2.xml17
7 files changed, 199 insertions, 0 deletions
diff --git a/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/LCEvaluator.java b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/LCEvaluator.java
new file mode 100644
index 0000000..b0fe69b
--- /dev/null
+++ b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/LCEvaluator.java
@@ -0,0 +1,59 @@
+package org.lambdanantes.lcgoji;
+
+import org.lambdanantes.lcgoji.ast.Abs;
+import org.lambdanantes.lcgoji.ast.App;
+import org.lambdanantes.lcgoji.ast.Term;
+import org.lambdanantes.lcgoji.ast.Var;
+
+import static org.lambdanantes.lcgoji.ast.Abs.λ;
+import static org.lambdanantes.lcgoji.ast.App.apply;
+
+public class LCEvaluator {
+
+ public static Term evaluate(Term term) {
+ switch (term) {
+ case Var var -> {
+ return var;
+ }
+ case Abs abs -> {
+ return abs;
+ }
+ case App app -> {
+ switch (app.left) {
+ case Abs abs -> {
+ return substitute(abs.body, abs.arg, app.right);
+ }
+ case App _app -> {
+ return app;
+ }
+ case Var _var -> {
+ return app;
+ }
+ }
+ }
+ }
+ }
+
+ private static Term substitute(Term body, String arg, Term val) {
+ switch (body) {
+ case Var var -> {
+ if (var.name.equals(arg)) {
+ return val;
+ } else {
+ return body;
+ }
+ }
+ case App app -> {
+ return apply(substitute(app.left, arg, val), substitute(app.right, arg, val));
+ }
+ case Abs abs -> {
+ if (abs.arg.equals(arg)) {
+ // Pas de substitution des variables redéfinies
+ return abs;
+ } else {
+ return λ(abs.arg, substitute(abs.body, arg, val));
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/Main.java b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/Main.java
new file mode 100644
index 0000000..76cb839
--- /dev/null
+++ b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/Main.java
@@ -0,0 +1,49 @@
+package org.lambdanantes.lcgoji;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.fluent.Request;
+import org.apache.http.client.fluent.Response;
+import org.apache.http.entity.StringEntity;
+
+import static spark.Spark.*;
+
+@Slf4j
+public class Main {
+
+ public static final String TEAM_NAME = "LCGOJI";
+ public static final int SELF_PORT = 8888;
+ public static final String SELF_URL = "http://127.0.0.1:" + SELF_PORT;
+ public static final String TESTER_URL = "http://127.0.0.1:8080";
+
+ public static void main(String[] args) throws Exception {
+ port(SELF_PORT);
+
+ before((request, response) -> log.info("Requête entrante : " + request.requestMethod() + " " + request.pathInfo() + ", query params : " + request.queryString()));
+
+ // API pour l'évaluation de λ-term
+ // Le body est une S-expression sous sa forme textuelle
+ post("/eval", (request, response) -> {
+ String body = request.body();
+ log.info("Demande d'évaluation de l'expression : " + body);
+
+ // TODO Parser, contruire l'AST, l'évaluer
+ String result = body; // Renvoie la s-expression à l'identique pour le moment
+
+ log.info("Réponse envoyée : " + body);
+
+ return result.getBytes();
+ });
+
+ init();
+
+ // Enregistrement de notre API auprès du tester d'API
+ String jsonBody = "{\"url\":\"" + SELF_URL + "/eval\", \"name\": \"" + TEAM_NAME + "\"}";
+ Response response = Request.Post(TESTER_URL + "/register")
+ .addHeader("Content-type", "application/json")
+ .body(new StringEntity(jsonBody))
+ .execute();
+
+ log.info("Résultat de l'enregistrement : "+response.returnContent().toString());
+ }
+
+} \ No newline at end of file
diff --git a/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Abs.java b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Abs.java
new file mode 100644
index 0000000..9d1c146
--- /dev/null
+++ b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Abs.java
@@ -0,0 +1,26 @@
+package org.lambdanantes.lcgoji.ast;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+
+import static org.lambdanantes.lcgoji.ast.Var.var;
+
+@AllArgsConstructor(access = AccessLevel.PROTECTED)
+@EqualsAndHashCode
+public final class Abs implements Term {
+
+ public static final Abs IDENTITY = λ("x", var("x"));
+
+ public String arg;
+ public Term body;
+
+ public static Abs λ(String arg, Term body) {
+ return new Abs(arg, body);
+ }
+
+ @Override
+ public String toString() {
+ return "λ" + arg + "." + body;
+ }
+} \ No newline at end of file
diff --git a/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/App.java b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/App.java
new file mode 100644
index 0000000..2f3e04d
--- /dev/null
+++ b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/App.java
@@ -0,0 +1,22 @@
+package org.lambdanantes.lcgoji.ast;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+
+@AllArgsConstructor(access = AccessLevel.PROTECTED)
+@EqualsAndHashCode
+public final class App implements Term {
+
+ public Term left;
+ public Term right;
+
+ public static App apply(Term left, Term right) {
+ return new App(left, right);
+ }
+
+ @Override
+ public String toString() {
+ return "(" + left + ") " + right;
+ }
+} \ No newline at end of file
diff --git a/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Term.java b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Term.java
new file mode 100644
index 0000000..2dcc9fe
--- /dev/null
+++ b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Term.java
@@ -0,0 +1,5 @@
+package org.lambdanantes.lcgoji.ast;
+
+public sealed interface Term permits Var, Abs, App {
+
+} \ No newline at end of file
diff --git a/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Var.java b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Var.java
new file mode 100644
index 0000000..ed710b6
--- /dev/null
+++ b/lambda-calcul/java/lcgoji/src/main/java/org/lambdanantes/lcgoji/ast/Var.java
@@ -0,0 +1,21 @@
+package org.lambdanantes.lcgoji.ast;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+
+@AllArgsConstructor(access = AccessLevel.PROTECTED)
+@EqualsAndHashCode
+public final class Var implements Term{
+
+ public String name;
+
+ public static Var var(String name) {
+ return new Var(name);
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+} \ No newline at end of file
diff --git a/lambda-calcul/java/lcgoji/src/main/resources/log4j2.xml b/lambda-calcul/java/lcgoji/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..f938085
--- /dev/null
+++ b/lambda-calcul/java/lcgoji/src/main/resources/log4j2.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration monitorInterval="60">
+ <appenders>
+ <console name="console" target="SYSTEM_OUT">
+ <patternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
+ </console>
+ </appenders>
+
+ <loggers>
+ <root level="debug">
+ <appender-ref ref="console"/>
+ </root>
+ <logger name="org.eclipse.jetty" level="warn"/>
+ <logger name="spark" level="info"/>
+ </loggers>
+</configuration>
+