在语义分析中,最流行的方法或数据结构之一是哈希表。实现哈希表相对容易,但是阅读此含义对我来说很复杂 - 我不知道我是否正确。根据演示文稿,如何实现具有多个值的令牌(键)的符号表?
我的想法是在下面创建一个表格:
给定输入字符串: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
作为key
和datatype & 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;
...
}
其中DataType
和Value
是自定义类,可根据需要表示类型和值。 那么符号表就是这样:
HashMap<String, SymbolEntry> symtab = new HashMap<>();
其中String
键是符号。
简而言之,您需要一个自定义类来表示构成符号表条目的值。 其余的留作"读者的练习"。