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