mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Fixed type bugs and header comments.
This commit is contained in:
parent
3187041be5
commit
d6b97f2277
@ -42,7 +42,7 @@ parser, semantics, and generator) of the compiler. Thus, a useful idiom
|
||||
is to give 'make' two targets, the component you just modified followed
|
||||
by the sanity test target like this:
|
||||
|
||||
make parser sanity
|
||||
make parser sanity
|
||||
|
||||
To automatically rebuild the parser and run the sanity test. What's
|
||||
missing is any kind of dependency rules, so using the root target
|
||||
|
@ -24,7 +24,7 @@ package com.compilercompany.ecmascript;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* JSILGenerator
|
||||
* Generates psuedo intermediate code.
|
||||
*/
|
||||
|
||||
public class JSILGenerator extends Evaluator implements Tokens {
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Unicode character classes.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
interface CharacterClasses {
|
||||
|
@ -23,11 +23,9 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* class Debugger
|
||||
*
|
||||
**/
|
||||
/*
|
||||
* Debugging tool.
|
||||
*/
|
||||
|
||||
public final class Debugger {
|
||||
|
||||
|
@ -21,9 +21,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* InputBuffer.java
|
||||
*
|
||||
* Filters and buffers characters from a Reader.
|
||||
* Filters and buffers characters from a input reader.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
@ -490,13 +488,13 @@ public class InputBuffer implements CharacterClasses {
|
||||
}
|
||||
|
||||
public int getColPos(int pos) {
|
||||
Debugger.trace("pos " + pos);
|
||||
//Debugger.trace("pos " + pos);
|
||||
int i,len;
|
||||
for(i = 0; line_breaks[i] <= pos && i <= lnNum; i++)
|
||||
;
|
||||
|
||||
int offset = line_breaks[i-1];
|
||||
Debugger.trace("offset " + offset);
|
||||
//Debugger.trace("offset " + offset);
|
||||
|
||||
return pos-offset;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ import sun.tools.javac.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* class Shell
|
||||
* A test shell.
|
||||
*/
|
||||
|
||||
public final class Shell {
|
||||
|
@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Scanner.java
|
||||
* Scans input for tokens.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -25,8 +25,8 @@ import java.lang.reflect.*;
|
||||
import sun.tools.javac.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* class Shell
|
||||
/*
|
||||
* A test tool.
|
||||
*/
|
||||
|
||||
public final class Shell implements Tokens {
|
||||
|
@ -22,8 +22,9 @@
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
**/
|
||||
/*
|
||||
* The states of the scanner.
|
||||
*/
|
||||
|
||||
interface States {
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Token.java
|
||||
* Represents token instances: literals and identifiers.
|
||||
*
|
||||
* This file implements the class Token that is used to carry
|
||||
* information from the Scanner to the Parser.
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Tokens.java
|
||||
* Defines token classes and their print names.
|
||||
*
|
||||
* This interface defines values for each token class that occurs in
|
||||
* ECMAScript 4. All but numericliteral, stringliteral, regexpliteral, and
|
||||
|
@ -24,8 +24,10 @@ import com.compilercompany.ecmascript.*;
|
||||
import sun.tools.util.CommandLine;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
/*
|
||||
* The main driver.
|
||||
*/
|
||||
|
||||
public class Main {
|
||||
|
||||
String[] classes;
|
||||
|
@ -27,15 +27,8 @@ import java.util.ResourceBundle;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.MissingResourceException;
|
||||
|
||||
/**
|
||||
* Messages, verbose and error handling support.
|
||||
*
|
||||
* For errors, the failure modes are:
|
||||
* error -- User did something wrong
|
||||
* bug -- Bug has occurred in javah
|
||||
* fatal -- We can't even find resources, so bail fast, don't localize
|
||||
*
|
||||
* @version 1.6, 02/02/00
|
||||
/*
|
||||
* Utility for the main driver.
|
||||
*/
|
||||
public class Util {
|
||||
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Not used.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
interface Attributes {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class Block
|
||||
* Represents a basic block for flow analysis.
|
||||
*/
|
||||
|
||||
public class Block {
|
||||
|
@ -27,7 +27,7 @@ import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
|
||||
/**
|
||||
* Context
|
||||
* Context used during semantic analysis.
|
||||
*/
|
||||
|
||||
public class Context {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* interface Errors
|
||||
* Not used.
|
||||
**/
|
||||
|
||||
public interface Errors {
|
||||
|
@ -23,8 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
*
|
||||
* Evaluator
|
||||
* The base visitor object extended by semantic evaluators.
|
||||
*
|
||||
* This is a visitor that is used by the compiler for various forms for
|
||||
* evaluation of a parse tree (e.g. a type evaluator might compute the
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* interface Init
|
||||
* Interface that object initializers implement.
|
||||
*
|
||||
* This interface is implemented by objects that can build
|
||||
* instances of the Value class. For example, there is an
|
||||
|
@ -23,9 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class Node
|
||||
*
|
||||
* To be a node you need to implement this interface.
|
||||
* The base Node class.
|
||||
*/
|
||||
|
||||
public class Node {
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Creates parse tree nodes.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
public final class NodeFactory {
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Parse tree nodes.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
|
@ -26,9 +26,7 @@ import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
/**
|
||||
* class Parser
|
||||
*
|
||||
* Parses ES4 programs.
|
||||
* Parse JS2 programs.
|
||||
*/
|
||||
|
||||
public class Parser implements Tokens, Errors {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Scope
|
||||
* A scope, which contains slots.
|
||||
*/
|
||||
|
||||
public interface Scope {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Slot
|
||||
* A slot.
|
||||
*/
|
||||
|
||||
public class Slot {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
*
|
||||
* The interfaces for all types.
|
||||
*/
|
||||
|
||||
public interface Type extends Init {
|
||||
|
@ -25,9 +25,7 @@ import java.util.Hashtable;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* Value
|
||||
*
|
||||
* This is the value class from which all other values derive.
|
||||
* The value class from which all other values derive.
|
||||
*/
|
||||
|
||||
abstract public class Value implements Scope {
|
||||
|
@ -26,13 +26,12 @@ import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* class BlockEvaluator
|
||||
* Delineates the program into its basic execution blocks.
|
||||
*
|
||||
* The purpose of this pass is to delineate the basic
|
||||
* blocks of the program. It is necessary to know all
|
||||
* the blocks in the program before we can mark the
|
||||
* flow-control edges and compute the dominance relationship
|
||||
* between a reference and definition.
|
||||
* It is necessary to know all the blocks in the program
|
||||
* before we can mark the flow-control edges and compute
|
||||
* the dominance relationship between a reference and
|
||||
* definition.
|
||||
*
|
||||
* The algorithm for partitioning the program into basic
|
||||
* blocks goes like this:
|
||||
|
@ -25,7 +25,7 @@ import java.util.*;
|
||||
import java.io.StringReader;
|
||||
|
||||
/**
|
||||
* ConstantEvaluator
|
||||
* Computes the compile-time values of a program.
|
||||
*
|
||||
* The ConstantEvaluator evaluates all expressions to either Undefined or
|
||||
* a definite constant value. Each statement evaluates to a CompletionValue
|
||||
@ -38,7 +38,7 @@ import java.io.StringReader;
|
||||
|
||||
public class ConstantEvaluator extends Evaluator implements Tokens, Attributes {
|
||||
|
||||
private static final boolean debug = false;
|
||||
private static final boolean debug = true;
|
||||
|
||||
// Expressions
|
||||
|
||||
@ -81,7 +81,7 @@ public class ConstantEvaluator extends Evaluator implements Tokens, Attributes {
|
||||
}
|
||||
|
||||
if( qualifier != null &&
|
||||
!(NamespaceType.type.includes(qualifier) || ClassType.type.includes(qualifier)) ) {
|
||||
!(NamespaceType.type.includes(qualifier) || TypeType.type.includes(qualifier)) ) {
|
||||
error(context,0,"Identifier qualifier must evaluate to a namespace or type.",node.qualifier.pos());
|
||||
return UndefinedValue.undefinedValue;
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ import java.util.Vector;
|
||||
|
||||
public final class ClassType extends ObjectType implements Type {
|
||||
|
||||
boolean debug = false;
|
||||
private static final boolean debug = false;
|
||||
|
||||
public static final TypeValue type = new TypeValue(new ClassType());
|
||||
|
||||
@ -47,7 +47,7 @@ public final class ClassType extends ObjectType implements Type {
|
||||
|
||||
private ClassType() {
|
||||
super("class");
|
||||
TypeType.type.addSub(this);
|
||||
ObjectType.type.addSub(this);
|
||||
}
|
||||
|
||||
private Type superType;
|
||||
|
@ -29,7 +29,7 @@ import java.util.Vector;
|
||||
|
||||
public class ObjectType implements Type {
|
||||
|
||||
private static final boolean debug = false;
|
||||
private static final boolean debug = true;
|
||||
|
||||
public static final TypeValue type = new TypeValue(new ObjectType());
|
||||
|
||||
@ -108,11 +108,9 @@ public class ObjectType implements Type {
|
||||
|
||||
public boolean includes(Value value) {
|
||||
|
||||
// A type is always a member of itself.
|
||||
|
||||
if(value.type==ObjectType.type) {
|
||||
return true;
|
||||
}
|
||||
if( debug ) {
|
||||
Debugger.trace("ObjectType.includes() with this = " + this + ", value.type = " + value.type + ", values_ = " + values_);
|
||||
}
|
||||
|
||||
return values_.contains(value.type);
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class BooleanValue
|
||||
* A boolean value: true or false.
|
||||
*/
|
||||
|
||||
public class BooleanValue extends ObjectValue {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class CharacterValue
|
||||
* A character value.
|
||||
*/
|
||||
|
||||
public class CharacterValue extends ObjectValue {
|
||||
|
@ -24,10 +24,9 @@ package com.compilercompany.ecmascript;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* class CodeValue
|
||||
* A code value (intermediate).
|
||||
*
|
||||
* This value holds the compiled code for an unevaluated
|
||||
* expression.
|
||||
* This value holds the intermediate code for an non-constant value.
|
||||
*/
|
||||
|
||||
public class CodeValue extends Value {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class CompletionValue
|
||||
* A completion value (intermediate).
|
||||
*/
|
||||
|
||||
public class CompletionValue extends Value {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* GlobalObject
|
||||
* The global object initializer.
|
||||
*
|
||||
* An instance of this class is used to initialize a global
|
||||
* object.
|
||||
|
@ -25,7 +25,7 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* class ListValue
|
||||
* A list value (intermediate).
|
||||
*/
|
||||
|
||||
public class ListValue extends ObjectValue {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class NullValue
|
||||
* The null value.
|
||||
*/
|
||||
|
||||
public class NullValue extends ObjectValue {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class NumberValue
|
||||
* A number value.
|
||||
*/
|
||||
|
||||
public final class NumberValue extends ObjectValue {
|
||||
|
@ -26,7 +26,7 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* ObjectValue
|
||||
* An object value.
|
||||
*/
|
||||
|
||||
public class ObjectValue extends Value implements Attributes, Scope {
|
||||
@ -46,6 +46,7 @@ public class ObjectValue extends Value implements Attributes, Scope {
|
||||
*/
|
||||
|
||||
public ObjectValue() {
|
||||
this.type = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -25,12 +25,12 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* class ReferenceValue
|
||||
* A reference value.
|
||||
*/
|
||||
|
||||
public class ReferenceValue extends Value {
|
||||
|
||||
private static final boolean debug = false;
|
||||
private static final boolean debug = true;
|
||||
|
||||
Scope scope;
|
||||
Vector namespaces;
|
||||
@ -101,7 +101,7 @@ public class ReferenceValue extends Value {
|
||||
public Slot getSlot(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getSlot() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getSlot() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Slot slot = null;
|
||||
@ -140,7 +140,7 @@ public class ReferenceValue extends Value {
|
||||
public Value getValue(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getValue() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getValue() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Value value = UndefinedValue.undefinedValue;
|
||||
@ -169,7 +169,7 @@ public class ReferenceValue extends Value {
|
||||
public Value getType(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getValue() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getType() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Value type = ObjectType.type;
|
||||
@ -183,7 +183,7 @@ public class ReferenceValue extends Value {
|
||||
Value getAttrs(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getAttrs() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getAttrs() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Value attrs = null;
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class StringValue
|
||||
* A string value.
|
||||
*/
|
||||
|
||||
public final class StringValue extends ObjectValue {
|
||||
|
@ -25,7 +25,7 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* class TypeValue
|
||||
* A type value.
|
||||
*
|
||||
* TypeValues have an internal property valueType that is
|
||||
* the type that this value represents. The type of a TypeValue
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class UndefinedValue
|
||||
* The undefined value.
|
||||
*/
|
||||
|
||||
public class UndefinedValue extends ObjectValue {
|
||||
|
@ -42,7 +42,7 @@ parser, semantics, and generator) of the compiler. Thus, a useful idiom
|
||||
is to give 'make' two targets, the component you just modified followed
|
||||
by the sanity test target like this:
|
||||
|
||||
make parser sanity
|
||||
make parser sanity
|
||||
|
||||
To automatically rebuild the parser and run the sanity test. What's
|
||||
missing is any kind of dependency rules, so using the root target
|
||||
|
@ -24,7 +24,7 @@ package com.compilercompany.ecmascript;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* JSILGenerator
|
||||
* Generates psuedo intermediate code.
|
||||
*/
|
||||
|
||||
public class JSILGenerator extends Evaluator implements Tokens {
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Unicode character classes.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
interface CharacterClasses {
|
||||
|
@ -23,11 +23,9 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* class Debugger
|
||||
*
|
||||
**/
|
||||
/*
|
||||
* Debugging tool.
|
||||
*/
|
||||
|
||||
public final class Debugger {
|
||||
|
||||
|
@ -21,9 +21,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* InputBuffer.java
|
||||
*
|
||||
* Filters and buffers characters from a Reader.
|
||||
* Filters and buffers characters from a input reader.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
@ -490,13 +488,13 @@ public class InputBuffer implements CharacterClasses {
|
||||
}
|
||||
|
||||
public int getColPos(int pos) {
|
||||
Debugger.trace("pos " + pos);
|
||||
//Debugger.trace("pos " + pos);
|
||||
int i,len;
|
||||
for(i = 0; line_breaks[i] <= pos && i <= lnNum; i++)
|
||||
;
|
||||
|
||||
int offset = line_breaks[i-1];
|
||||
Debugger.trace("offset " + offset);
|
||||
//Debugger.trace("offset " + offset);
|
||||
|
||||
return pos-offset;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ import sun.tools.javac.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* class Shell
|
||||
* A test shell.
|
||||
*/
|
||||
|
||||
public final class Shell {
|
||||
|
@ -21,7 +21,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Scanner.java
|
||||
* Scans input for tokens.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -25,8 +25,8 @@ import java.lang.reflect.*;
|
||||
import sun.tools.javac.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* class Shell
|
||||
/*
|
||||
* A test tool.
|
||||
*/
|
||||
|
||||
public final class Shell implements Tokens {
|
||||
|
@ -22,8 +22,9 @@
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
**/
|
||||
/*
|
||||
* The states of the scanner.
|
||||
*/
|
||||
|
||||
interface States {
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Token.java
|
||||
* Represents token instances: literals and identifiers.
|
||||
*
|
||||
* This file implements the class Token that is used to carry
|
||||
* information from the Scanner to the Parser.
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Tokens.java
|
||||
* Defines token classes and their print names.
|
||||
*
|
||||
* This interface defines values for each token class that occurs in
|
||||
* ECMAScript 4. All but numericliteral, stringliteral, regexpliteral, and
|
||||
|
@ -24,8 +24,10 @@ import com.compilercompany.ecmascript.*;
|
||||
import sun.tools.util.CommandLine;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
/*
|
||||
* The main driver.
|
||||
*/
|
||||
|
||||
public class Main {
|
||||
|
||||
String[] classes;
|
||||
|
@ -27,15 +27,8 @@ import java.util.ResourceBundle;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.MissingResourceException;
|
||||
|
||||
/**
|
||||
* Messages, verbose and error handling support.
|
||||
*
|
||||
* For errors, the failure modes are:
|
||||
* error -- User did something wrong
|
||||
* bug -- Bug has occurred in javah
|
||||
* fatal -- We can't even find resources, so bail fast, don't localize
|
||||
*
|
||||
* @version 1.6, 02/02/00
|
||||
/*
|
||||
* Utility for the main driver.
|
||||
*/
|
||||
public class Util {
|
||||
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Not used.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
interface Attributes {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class Block
|
||||
* Represents a basic block for flow analysis.
|
||||
*/
|
||||
|
||||
public class Block {
|
||||
|
@ -27,7 +27,7 @@ import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
|
||||
/**
|
||||
* Context
|
||||
* Context used during semantic analysis.
|
||||
*/
|
||||
|
||||
public class Context {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* interface Errors
|
||||
* Not used.
|
||||
**/
|
||||
|
||||
public interface Errors {
|
||||
|
@ -23,8 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
*
|
||||
* Evaluator
|
||||
* The base visitor object extended by semantic evaluators.
|
||||
*
|
||||
* This is a visitor that is used by the compiler for various forms for
|
||||
* evaluation of a parse tree (e.g. a type evaluator might compute the
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* interface Init
|
||||
* Interface that object initializers implement.
|
||||
*
|
||||
* This interface is implemented by objects that can build
|
||||
* instances of the Value class. For example, there is an
|
||||
|
@ -23,9 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class Node
|
||||
*
|
||||
* To be a node you need to implement this interface.
|
||||
* The base Node class.
|
||||
*/
|
||||
|
||||
public class Node {
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Creates parse tree nodes.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
public final class NodeFactory {
|
||||
|
@ -20,6 +20,10 @@
|
||||
* Jeff Dyer <jeff@compilercompany.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Parse tree nodes.
|
||||
*/
|
||||
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
|
@ -26,9 +26,7 @@ import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
/**
|
||||
* class Parser
|
||||
*
|
||||
* Parses ES4 programs.
|
||||
* Parse JS2 programs.
|
||||
*/
|
||||
|
||||
public class Parser implements Tokens, Errors {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Scope
|
||||
* A scope, which contains slots.
|
||||
*/
|
||||
|
||||
public interface Scope {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* Slot
|
||||
* A slot.
|
||||
*/
|
||||
|
||||
public class Slot {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
*
|
||||
* The interfaces for all types.
|
||||
*/
|
||||
|
||||
public interface Type extends Init {
|
||||
|
@ -25,9 +25,7 @@ import java.util.Hashtable;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* Value
|
||||
*
|
||||
* This is the value class from which all other values derive.
|
||||
* The value class from which all other values derive.
|
||||
*/
|
||||
|
||||
abstract public class Value implements Scope {
|
||||
|
@ -26,13 +26,12 @@ import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* class BlockEvaluator
|
||||
* Delineates the program into its basic execution blocks.
|
||||
*
|
||||
* The purpose of this pass is to delineate the basic
|
||||
* blocks of the program. It is necessary to know all
|
||||
* the blocks in the program before we can mark the
|
||||
* flow-control edges and compute the dominance relationship
|
||||
* between a reference and definition.
|
||||
* It is necessary to know all the blocks in the program
|
||||
* before we can mark the flow-control edges and compute
|
||||
* the dominance relationship between a reference and
|
||||
* definition.
|
||||
*
|
||||
* The algorithm for partitioning the program into basic
|
||||
* blocks goes like this:
|
||||
|
@ -25,7 +25,7 @@ import java.util.*;
|
||||
import java.io.StringReader;
|
||||
|
||||
/**
|
||||
* ConstantEvaluator
|
||||
* Computes the compile-time values of a program.
|
||||
*
|
||||
* The ConstantEvaluator evaluates all expressions to either Undefined or
|
||||
* a definite constant value. Each statement evaluates to a CompletionValue
|
||||
@ -38,7 +38,7 @@ import java.io.StringReader;
|
||||
|
||||
public class ConstantEvaluator extends Evaluator implements Tokens, Attributes {
|
||||
|
||||
private static final boolean debug = false;
|
||||
private static final boolean debug = true;
|
||||
|
||||
// Expressions
|
||||
|
||||
@ -81,7 +81,7 @@ public class ConstantEvaluator extends Evaluator implements Tokens, Attributes {
|
||||
}
|
||||
|
||||
if( qualifier != null &&
|
||||
!(NamespaceType.type.includes(qualifier) || ClassType.type.includes(qualifier)) ) {
|
||||
!(NamespaceType.type.includes(qualifier) || TypeType.type.includes(qualifier)) ) {
|
||||
error(context,0,"Identifier qualifier must evaluate to a namespace or type.",node.qualifier.pos());
|
||||
return UndefinedValue.undefinedValue;
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ import java.util.Vector;
|
||||
|
||||
public final class ClassType extends ObjectType implements Type {
|
||||
|
||||
boolean debug = false;
|
||||
private static final boolean debug = false;
|
||||
|
||||
public static final TypeValue type = new TypeValue(new ClassType());
|
||||
|
||||
@ -47,7 +47,7 @@ public final class ClassType extends ObjectType implements Type {
|
||||
|
||||
private ClassType() {
|
||||
super("class");
|
||||
TypeType.type.addSub(this);
|
||||
ObjectType.type.addSub(this);
|
||||
}
|
||||
|
||||
private Type superType;
|
||||
|
@ -29,7 +29,7 @@ import java.util.Vector;
|
||||
|
||||
public class ObjectType implements Type {
|
||||
|
||||
private static final boolean debug = false;
|
||||
private static final boolean debug = true;
|
||||
|
||||
public static final TypeValue type = new TypeValue(new ObjectType());
|
||||
|
||||
@ -108,11 +108,9 @@ public class ObjectType implements Type {
|
||||
|
||||
public boolean includes(Value value) {
|
||||
|
||||
// A type is always a member of itself.
|
||||
|
||||
if(value.type==ObjectType.type) {
|
||||
return true;
|
||||
}
|
||||
if( debug ) {
|
||||
Debugger.trace("ObjectType.includes() with this = " + this + ", value.type = " + value.type + ", values_ = " + values_);
|
||||
}
|
||||
|
||||
return values_.contains(value.type);
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class BooleanValue
|
||||
* A boolean value: true or false.
|
||||
*/
|
||||
|
||||
public class BooleanValue extends ObjectValue {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class CharacterValue
|
||||
* A character value.
|
||||
*/
|
||||
|
||||
public class CharacterValue extends ObjectValue {
|
||||
|
@ -24,10 +24,9 @@ package com.compilercompany.ecmascript;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* class CodeValue
|
||||
* A code value (intermediate).
|
||||
*
|
||||
* This value holds the compiled code for an unevaluated
|
||||
* expression.
|
||||
* This value holds the intermediate code for an non-constant value.
|
||||
*/
|
||||
|
||||
public class CodeValue extends Value {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class CompletionValue
|
||||
* A completion value (intermediate).
|
||||
*/
|
||||
|
||||
public class CompletionValue extends Value {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* GlobalObject
|
||||
* The global object initializer.
|
||||
*
|
||||
* An instance of this class is used to initialize a global
|
||||
* object.
|
||||
|
@ -25,7 +25,7 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* class ListValue
|
||||
* A list value (intermediate).
|
||||
*/
|
||||
|
||||
public class ListValue extends ObjectValue {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class NullValue
|
||||
* The null value.
|
||||
*/
|
||||
|
||||
public class NullValue extends ObjectValue {
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class NumberValue
|
||||
* A number value.
|
||||
*/
|
||||
|
||||
public final class NumberValue extends ObjectValue {
|
||||
|
@ -26,7 +26,7 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* ObjectValue
|
||||
* An object value.
|
||||
*/
|
||||
|
||||
public class ObjectValue extends Value implements Attributes, Scope {
|
||||
@ -46,6 +46,7 @@ public class ObjectValue extends Value implements Attributes, Scope {
|
||||
*/
|
||||
|
||||
public ObjectValue() {
|
||||
this.type = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -25,12 +25,12 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* class ReferenceValue
|
||||
* A reference value.
|
||||
*/
|
||||
|
||||
public class ReferenceValue extends Value {
|
||||
|
||||
private static final boolean debug = false;
|
||||
private static final boolean debug = true;
|
||||
|
||||
Scope scope;
|
||||
Vector namespaces;
|
||||
@ -101,7 +101,7 @@ public class ReferenceValue extends Value {
|
||||
public Slot getSlot(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getSlot() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getSlot() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Slot slot = null;
|
||||
@ -140,7 +140,7 @@ public class ReferenceValue extends Value {
|
||||
public Value getValue(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getValue() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getValue() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Value value = UndefinedValue.undefinedValue;
|
||||
@ -169,7 +169,7 @@ public class ReferenceValue extends Value {
|
||||
public Value getType(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getValue() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getType() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Value type = ObjectType.type;
|
||||
@ -183,7 +183,7 @@ public class ReferenceValue extends Value {
|
||||
Value getAttrs(Context context) throws Exception {
|
||||
|
||||
if( debug ) {
|
||||
Debugger.trace("ReferenceType.getAttrs() with context = " + context );
|
||||
Debugger.trace("ReferenceValue.getAttrs() with namespaces = " + namespaces + ", name = " + name );
|
||||
}
|
||||
|
||||
Value attrs = null;
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class StringValue
|
||||
* A string value.
|
||||
*/
|
||||
|
||||
public final class StringValue extends ObjectValue {
|
||||
|
@ -25,7 +25,7 @@ import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* class TypeValue
|
||||
* A type value.
|
||||
*
|
||||
* TypeValues have an internal property valueType that is
|
||||
* the type that this value represents. The type of a TypeValue
|
||||
|
@ -23,7 +23,7 @@
|
||||
package com.compilercompany.ecmascript;
|
||||
|
||||
/**
|
||||
* class UndefinedValue
|
||||
* The undefined value.
|
||||
*/
|
||||
|
||||
public class UndefinedValue extends ObjectValue {
|
||||
|
Loading…
Reference in New Issue
Block a user