Skip to content

Commit c1e294e

Browse files
authored
Create BasicUnicodeToken.java
1 parent 6d63a77 commit c1e294e

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package pl.koder95.interpreter.basic;
2+
3+
import java.util.Objects;
4+
import pl.koder95.interpreter.NonTerminalExpression;
5+
6+
/**
7+
* Reprezentuje podstawowy (niezłożony) token zawierający ciąg znaków tej samej kategorii Unicode.
8+
* Klasa ta implementuje interfejs {@link pl.koder95.interpreter.NonTerminalExpression NonTerminalExpression} dla typu {@link String}.
9+
* Token jest uważany za "podstawowy", ponieważ zawiera znaki tylko jednej kategorii Unicode,
10+
* co odróżnia go od tokenów złożonych, które mogą zawierać znaki różnych kategorii.
11+
*/
12+
public class BasicUnicodeToken implements NonTerminalExpression<String> {
13+
private final String value;
14+
15+
/**
16+
* Tworzy nowy podstawowy token z podaną wartością.
17+
*
18+
* @param value wartość tokenu jako ciąg znaków; nie może być {@code null}.
19+
* @throws NullPointerException jeśli wartość jest {@code null}.
20+
* @throws IllegalArgumentException jeśli ciąg znaków zawiera znaki różnych kategorii Unicode.
21+
*/
22+
public BasicUnicodeToken(String value) {
23+
Objects.requireNonNull(value, "Value cannot be null");
24+
25+
if (value.isEmpty()) {
26+
throw new IllegalArgumentException("Value cannot be empty");
27+
}
28+
29+
// Sprawdź, czy wszystkie znaki mają tę samą kategorię Unicode
30+
int firstCharType = Character.getType(value.charAt(0));
31+
for (int i = 1; i < value.length(); i++) {
32+
if (Character.getType(value.charAt(i)) != firstCharType) {
33+
throw new IllegalArgumentException(
34+
"All characters in the value must be of the same Unicode category. " +
35+
"Mismatch at position " + i + ": expected category " + firstCharType +
36+
", but found " + Character.getType(value.charAt(i))
37+
);
38+
}
39+
}
40+
41+
this.value = value;
42+
}
43+
44+
/**
45+
* Zwraca wartość tokenu jako ciąg znaków.
46+
*
47+
* @return wartość tokenu.
48+
*/
49+
@Override
50+
public String getObject() {
51+
return value;
52+
}
53+
54+
/**
55+
* Zwraca reprezentację tekstową tokenu. W tej implementacji jest to po prostu wartość tokenu.
56+
*
57+
* @return wartość tokenu jako ciąg znaków.
58+
*/
59+
@Override
60+
public String asString() {
61+
return value;
62+
}
63+
64+
/**
65+
* Zwraca kategorię Unicode dla pierwszego znaku w wartości tokenu.
66+
* Kategoria Unicode jest określana za pomocą metody {@link Character#getType(int)}.
67+
*
68+
* @return kategoria Unicode jako wartość całkowita.
69+
* @throws IllegalStateException jeśli wartość tokenu jest pusta.
70+
*/
71+
public int getType() {
72+
if (value.isEmpty()) {
73+
throw new IllegalStateException("Value is empty, cannot determine type");
74+
}
75+
return Character.getType(value.charAt(0));
76+
}
77+
78+
/**
79+
* Zwraca czytelny opis tokenu, zawierający jego wartość oraz kategorię Unicode.
80+
*
81+
* @return opis tokenu w formacie "Token: [wartość], Type: [kategoria]".
82+
*/
83+
@Override
84+
public String toString() {
85+
return "Token: " + value + ", Type: " + getType();
86+
}
87+
}

0 commit comments

Comments
 (0)