?? typechecker.java
字號:
err.report(7, ident.getLine(), ident.getPos());
}
else {
err.report(23, ident.getLine(), ident.getPos());
}
}
else if (monitor_call) {
if (!monitor_table.containsKey(key)) {
err.report(34, ident.getLine(), ident.getPos());
}
else {
entity = monitor_table.get(key);
if (entity instanceof Procedure) {
if (((Procedure) entity).isPrivate()) {
err.report(51, ident.getLine(),ident.getPos());
}
else if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else {
err.report(15, ident.getLine(), ident.getPos());
}
}
}
else {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
}
else if (previous_entity == MONITOR) {
if (monitor_table.containsKey(key)) {
entity = monitor_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure)) {
err.report(45, ident.getLine(), ident.getPos());
}
}
else {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
}
else {
if (local_table.containsKey(key)) {
entity = local_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else {
err.report(23, ident.getLine(), ident.getPos());
}
}
else {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
}
if (exp_list.size() > 0) {
err.report(24, ident.getLine(), ident.getPos());
}
}
/**
* sets procedure_call to true.
*/
public void inAArgumentsProcedureCall(AArgumentsProcedureCall node) {
if (!exp_list.isEmpty()) {
exp_list.removeAllElements();
}
procedure_call = true;
}
/**
* @see TypeChecker.outAIdentifierProcedureCall
*/
public void outAArgumentsProcedureCall(AArgumentsProcedureCall node) {
TIdentifier ident = node.getIdentifier();
String key = ident.getText().toUpperCase();
Object entity = null;
if (program) {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
else if (monitor) {
if (monitor_table.containsKey(key)) {
entity = monitor_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure)) {
err.report(45, ident.getLine(), ident.getPos());
}
else {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
else {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
}
else if (process) {
if (local_table.containsKey(key)) {
entity = local_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else {
err.report(23, ident.getLine(), ident.getPos());
}
}
else if (monitor_call) {
if (!monitor_table.containsKey(key)) {
err.report(34, ident.getLine(), ident.getPos());
}
else {
entity = monitor_table.get(key);
if (entity instanceof Procedure) {
if (((Procedure) entity).isPrivate()) {
err.report(51, ident.getLine(),ident.getPos());
}
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else {
err.report(15, ident.getLine(), ident.getPos());
}
}
}
else {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
}
else if (previous_entity == MONITOR) {
if (monitor_table.containsKey(key)) {
entity = monitor_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure)) {
err.report(45, ident.getLine(), ident.getPos());
}
else if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
}
else {
if (local_table.containsKey(key)) {
entity = local_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else {
err.report(23, ident.getLine(), ident.getPos());
}
}
else {
entity = global_table.get(key);
if (entity instanceof Variable) {
err.report(7, ident.getLine(), ident.getPos());
}
else if (!(entity instanceof Procedure) && !(entity instanceof Function)) {
err.report(23, ident.getLine(), ident.getPos());
}
else if (entity instanceof Procedure) {
if (((Procedure) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
else if (entity instanceof Function) {
if (((Function) entity).raisesException() && !try_statement) {
err.report(37, ident.getLine(), ident.getPos());
}
}
}
}
if (entity instanceof Procedure) {
arguments = ((Procedure) entity).getArguments();
}
else {
arguments = ((Function) entity).getArguments();
}
if ((arguments == null) || (arguments.size() != exp_list.size())) {
err.report(24, ident.getLine(), ident.getPos());
}
Enumeration exp = exp_list.elements();
Type t1, t2;
for (Enumeration e = arguments.elements(); e.hasMoreElements();) {
t1 = (Type) e.nextElement();
t2 = (Type) exp.nextElement();
if ((t1 instanceof ARRAY) || (t2 instanceof ARRAY)) {
err.report(25, ident.getLine(), ident.getPos());
}
else if (t1 != t2) {
err.report(10, ident.getLine(), ident.getPos());
}
}
}
/**
* reports an error if the identifier is not declared in
* the global declaration part and it is not a channel variable.
*/
public void outAChannelVariable(AChannelVariable node) {
TIdentifier ident = node.getIdentifier();
String key = ident.getText().toUpperCase();
if (!global_table.containsKey(key)) {
err.report(38, ident.getLine(), ident.getPos());
}
else if (!(global_table.get(key) instanceof Variable) &&
!(((Variable) global_table.get(key)).getType() instanceof CHANNEL)) {
err.report(38, ident.getLine(), ident.getPos());
}
}
/**
* sets channel_operations to true
*/
public void inASendStatement(ASendStatement node) {
channel_operations = true;
}
/**
* if the identifier is not of the same type as the channel,
* an error is reported.
*/
public void outASendStatement(ASendStatement node) {
TIdentifier ident = ((AChannelVariable) node.getChannelVariable()).getIdentifier();
String key = ident.getText().toUpperCase();
if (!process) {
err.report(44, node.getSend().getLine(), node.getSend().getPos());
}
Type type_ = ((CHANNEL) ((Variable) global_table.get(key)).getType()).getType();
if (type_ != type) {
err.report(10, node.getSend().getLine(), node.getSend().getPos());
}
channel_operations = false;
}
/**
* sets channel_operations to true.
*/
public void inAReceiveStatement(AReceiveStatement node) {
channel_operations = true;
}
/**
* @see TypeChecker.outASendStatement
*/
public void outAReceiveStatement(AReceiveStatement node) {
TIdentifier ident1 = ((AChannelVariable)node.getChannelVariable()).getIdentifier();
TIdentifier ident2 = node.getIdentifier();
String key1 = ident1.getText().toUpperCase();
String key2 = ident2.getText().toUpperCase();
Type type1, type2 = null;
if (!process) {
err.report(44, node.getReceive().getLine(), node.getReceive().getPos());
}
if (local_table.containsKey(key2)) {
Object entity = local_table.get(key2);
if (!(entity instanceof Variable)) {
err.report(43, ident2.getLine(), ident2.getPos());
}
else {
type2 = ((Variable) entity).getType();
}
}
else {
if (!(global_table.get(key2) instanceof Variable)) {
err.report(43, ident2.getLine(), ident2.getPos());
}
else {
type2 = ((Variable) global_table.get(key2)).getType();
}
}
type1 = ((CHANNEL) ((Variable) global_table.get(key1)).getType()).getType();
if (type1 != type2) {
err.report(10, node.getReceive().getLine(), node.getReceive().getPos());
}
channel_operations = false;
}
/**
* sets monitor call to true
*/
public void inAMonitorCallStatement(AMonitorCallStatement node) {
monitor_call = true;
}
/**
* checks if the identifier is a monitor, and reports an error
* if it is not.
*/
public void outAMonitorCallStatement(AMonitorCallStatement node) {
TIdentifier ident = node.getIdentifier();
String key = ident.getText().toUpperCase();
if (!process) {
err.report(44, ident.getLine(), ident.getPos());
}
if (!global_table.containsKey(key) ||
!(global_table.get(key) instanceof Monitor)) {
err.report(46, ident.getLine(), ident.getPos());
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -