Skip to content

Commit def321a

Browse files
committed
Pierwsza wersja interpretera
1 parent 14537e8 commit def321a

File tree

7 files changed

+80
-0
lines changed

7 files changed

+80
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package pl.koder95.interpreter;
2+
3+
/**
4+
* Interfejs klienta, który rozpoczyna tworzenie instancji {@link Interpreter interpretera} zależnego od podanego kontekstu.
5+
* @param <I> typ {@link Interpreter interpretera} zwracanego przez klienta
6+
* @param <C> typ {@link Context kontekstu}, jaki obsługiwany jest przez interpreter
7+
* @param <R> typ obiektu zwracanego przez interpreter
8+
*/
9+
public interface Client<I extends Interpreter<C, R>, C extends Context, R> {
10+
11+
/**
12+
* Tworzy nową instancję {@link Interpreter interpretera}.
13+
* @param context {@link Context kontekst} obsługiwany przez utworzony interpreter
14+
* @return nowa instancja {@link Interpreter interpretera}
15+
*/
16+
I newInterpreter(C context);
17+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package pl.koder95.interpreter;
2+
3+
/**
4+
* Interfejs kontekstu, w jakim interpretowane będą wyrażenia.
5+
* Języki formalne mogą mieć gramatykę niekontekstową lub kontekstową. Z tego powodu ten interfejs nie posiada żadnych
6+
* metod do implementacji i idealnie nadaje się do zastosowania w gramatykach bezkontekstowych w aktualnej formie.
7+
* Rozszerzenie interfejsu z dodaniem własnych metod umożliwi wykorzystanie go w gramatykach kontekstowych.
8+
*/
9+
public interface Context {
10+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package pl.koder95.interpreter;
2+
3+
public sealed interface Expression<C extends Context, R> permits TerminalExpression, NonTerminalExpression {
4+
5+
R interpret(C context);
6+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pl.koder95.interpreter;
2+
3+
public interface Interpreter<C extends Context, R> {
4+
5+
C getContext();
6+
7+
Expression<C,R> buildAbstractSyntaxTree(String expression);
8+
9+
default R interpret(String expression) {
10+
Expression<C, R> ast = buildAbstractSyntaxTree(expression);
11+
return ast.interpret(getContext());
12+
}
13+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package pl.koder95.interpreter;
2+
3+
public non-sealed interface NonTerminalExpression<C extends Context, R> extends Expression<C, R> {
4+
@Override
5+
default R interpret(C context) {
6+
throw new UnsupportedOperationException();
7+
}
8+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package pl.koder95.interpreter;
2+
3+
/**
4+
* Wyjątek wyrzucany w przypadku błędów syntaktycznych podczas działania interpretera.
5+
*/
6+
public class SyntaxException extends IllegalArgumentException {
7+
8+
public SyntaxException() {
9+
}
10+
11+
public SyntaxException(String message) {
12+
super(message);
13+
}
14+
15+
public SyntaxException(String message, Throwable cause) {
16+
super(message, cause);
17+
}
18+
19+
public SyntaxException(Throwable cause) {
20+
super(cause);
21+
}
22+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package pl.koder95.interpreter;
2+
3+
public non-sealed interface TerminalExpression<C extends Context, R> extends Expression<C, R> {
4+
}

0 commit comments

Comments
 (0)