103 lines
2.3 KiB
Java
103 lines
2.3 KiB
Java
package com.compiler.parser;
|
|
|
|
import com.compiler.lexer.Token;
|
|
|
|
public class Symbol {
|
|
|
|
Symbol() {
|
|
sType = SymbolType.Terminal;
|
|
// id = "";
|
|
}
|
|
|
|
|
|
Symbol(final String name, SymbolType st) {
|
|
id = name;
|
|
sType = st;
|
|
value = "";
|
|
}
|
|
|
|
Symbol(final String name, SymbolType st, String value, Token.tokenType type) {
|
|
id = name;
|
|
sType = st;
|
|
this.value = value;
|
|
this.valueType = type;
|
|
}
|
|
|
|
Symbol(final String name, ActionType at) {
|
|
id = name;
|
|
aType = at;
|
|
sType = SymbolType.Action;
|
|
this.value = "";
|
|
}
|
|
|
|
enum SymbolType {
|
|
Terminal, Nonterminal, Empty, End, Action
|
|
}
|
|
|
|
enum ActionType {
|
|
PUSH, FILL, FILL_I //有初值的填表
|
|
, FILL_ARRAY //填数组表
|
|
, FILL_EMPTY_ARRAY //填空数组
|
|
, PUSH_CAPACITY //将数组容量压栈
|
|
, GEQ //生成运算四元式
|
|
, GEQ_IF, END_IF, BEGIN_ELSE, GEQ_WHILE, END_WHILE, GEQ_PRINTLN ,GEQ_PRINT, GEQ_BREAK, GEQ_CONTINUE, BEGIN_STRUCT, END_STRUCUT, PUSH_MEMBER
|
|
}
|
|
|
|
public String getId() {
|
|
return id;
|
|
}
|
|
|
|
public SymbolType getType() {
|
|
return sType;
|
|
}
|
|
|
|
public ActionType getaType() {
|
|
return aType;
|
|
}
|
|
|
|
public String getValue() {
|
|
return value;
|
|
}
|
|
|
|
public Token.tokenType getValueType() {
|
|
return valueType;
|
|
}
|
|
|
|
private String id;
|
|
private SymbolType sType;
|
|
private ActionType aType;
|
|
private String value;
|
|
private Token.tokenType valueType = Token.tokenType.NONE;
|
|
|
|
@Override
|
|
public String toString() {
|
|
StringBuilder sb = new StringBuilder();
|
|
if (sType == SymbolType.Nonterminal)
|
|
sb.append("[N]");
|
|
else if (sType == SymbolType.Action)
|
|
sb.append("[AC]");
|
|
sb.append(id);
|
|
if (valueType != Token.tokenType.NONE) {
|
|
sb.append("(");
|
|
sb.append(value);
|
|
sb.append(")");
|
|
}
|
|
return sb.toString();
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return id.hashCode();
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
if (obj instanceof Symbol) {
|
|
var sym = (Symbol) obj;
|
|
return this.id.equals(sym.id) &&
|
|
this.sType.equals(sym.sType);
|
|
}
|
|
return false;
|
|
}
|
|
}
|