Java - 语义分析:实现具有键和多个值的哈希表



在语义分析中,最流行的方法或数据结构之一是哈希表。实现哈希表相对容易,但是阅读此含义对我来说很复杂 - 我不知道我是否正确。根据演示文稿,如何实现具有多个值的令牌()的符号表?

我的想法是在下面创建一个表格:

给定输入字符串:
VAR abc, b, c AS INT

| symbol | datatype | value |
-----------------------------
| VAR    | keyword  | null  |
| abc    | INT      | null  |
| b      | INT      | null  |
| c      | INT      | null  |
| AS     | keyword  | null  |
| CHAR   | keyword  | null  |

VAR x, w_23=’w’ AS CHAR

| symbol | datatype | value |
-----------------------------
| VAR    | keyword  | null  |
| x      | CHAR     | null  |
| w_23   | CHAR     | 'w'   |
| AS     | keyword  | null  |
| CHAR   | keyword  | null  |

所以,假设我有一个变量a如果我查找(a)那么它应该是错误的,因为查看表a不存在。此外,如果w_23=10也应该是一个错误,因为w_23属于CHAR类型,通常它只是一个类型检查。

我的问题是,是否可以创建像上面这样的符号表?如果是这样,我如何实现一个symbol作为keydatatype & value作为值的符号表?

我会使用一种基于泛型的方法。

首先,定义一个泛型类,如下所示:

public abstract class GenericEntry<T> {
protected T value;
@SuppressWarnings("unchecked")
public Class<? extends T> getDatatype() {
return (Class<? extends T>) value.getClass();
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}

然后定义材料类。一个用于字符,例如:

public class CharacterEntry extends GenericEntry<Character> { }

另一个用于整数:

public class IntegerEntry extends GenericEntry<Integer> { }

和一个带有一些测试的主:

public class Main {
public static void main(String[] args) {
HashMap<String, GenericEntry<?>> myMap = new HashMap<>();
CharacterEntry characterEntry = new CharacterEntry();
characterEntry.setValue('c');
myMap.put("key1", characterEntry);
IntegerEntry integerEntry = new IntegerEntry();
integerEntry.setValue(3);
myMap.put("key2", integerEntry);
GenericEntry<?> entry1 = myMap.get("key1");
System.out.println(entry1.getDatatype());
System.out.println(entry1.getValue());
GenericEntry<?> entry2 = myMap.get("key2");
System.out.println(entry2.getDatatype());   
System.out.println(entry2.getValue());
}
}

其输出为:

class java.lang.Character
c
class java.lang.Integer
3

从 @stephen-C 的答案中可以看出,方法可能不同,但无论如何,您都必须定义一个包含数据类型和值的类。

你可以像这样实现它:

public class SymbolEntry {
private String symbol;
private DataType datatype;
private Value value;
...
}

其中DataTypeValue是自定义类,可根据需要表示类型和值。 那么符号表就是这样:

HashMap<String, SymbolEntry> symtab = new HashMap<>();

其中String键是符号。

简而言之,您需要一个自定义类来表示构成符号表条目的值。 其余的留作"读者的练习"。

最新更新