2016-06-26 3 views
2

Ich mache eine RAM Machine Emulator in Typoskript definieren, so machte ich eine Enumeration der Befehlstypen, die ein RAM aufweisen kann:Wie einen Hash mit Enum Schlüssel in Typoskript

enum InsType { 
    LOAD, // Put value from specified register (or literal) into accumulator. 
    STORE, // Store value from accumulator into specified register. 
    READ, // Read from input tape and write into specified register. 
    WRITE, // Write to output tape from specified register. 
    ADD, // Add value into accumulator. 
    SUB, // Subtract value from accumulator. 
    MUL, // Multiply accumulator by referenced (or literal) value. 
    DIV, // Divide accumulator by referenced (or literal) value. 
    HALT, // Stop program execution. 
    JUMP, // Jump unconditionally to line specified by tag. 
    JZERO, // Jump to line specified by tag if accumulator value is zero. 
    JGTZ, // Jump to line specified by tag if acc value is greater than zero. 
} 

ich sicher machen müssen Jeder Befehl hat einen gültigen Operandentyp. Meine Art und Weise der gültigen Operanden zu definieren, ist wie folgt:

var valid_operands = { 
    LOAD: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    STORE: [     OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    READ: [     OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    WRITE: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    ADD: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    SUB: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    MUL: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    DIV: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    HALT: [OpType.NONE], 
    JUMP: [OpType.NAME], 
    JZERO: [OpType.NAME], 
    JGTZ: [OpType.NAME], 
} 

Aber ich finde, dass das Typoskript ‚Compiler‘ kümmert sich nicht darum, was ich in dem Schlüssel values-- habe ich LOAD: zu LOADXYZ: ändern kann und es gewann tu ein Auge.

Auch, wenn ich versuche, es zu, dies zu ändern:

var valid_operands = { 
    InsType.LOAD: [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT], 
    ... 

Es warnt ':' expected at line XX col YY (diejenigen, die Position des . ist). Ich benutze das Atom TypeScript-Plugin, wenn es hilft. Jede Hilfe wird geschätzt.

Antwort

6

Die Art, wie ich es gelöst habe, war, jeden Schlüsselpaarwert einzeln zuzuordnen.

var vo2 = { } 

vo2[InsType.LOAD] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.STORE] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.READ] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.WRITE] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.ADD] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.SUB] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.MUL] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.DIV] = [OpType.NUM_LITERAL, OpType.NUM_DIRECT, OpType.NUM_INDIRECT] 
vo2[InsType.HALT] = [OpType.NONE] 
vo2[InsType.JUMP] = [OpType.NAME] 
vo2[InsType.JZERO] = [OpType.NAME] 
vo2[InsType.JGTZ] = [OpType.NAME] 

Es funktioniert gut. Aber wenn jemand einen Weg findet, einen Hash mit Enum-Keys zu deklarieren, dann machen Sie bitte eine Antwort. :)

2

Sie können Map verwenden.

enum InsType { 
    LOAD, 
    STORE 
} 

enum OpType { 
    NUM_LITERAL 
} 

var vo2 = new Map<InsType, [OpType]>(); 
vo2.set(InsType.LOAD, [OpType.NUM_LITERAL]); 
+0

Danke, das ist auch eine gültige Antwort. Die Art und Weise, wie es sich von dem unterscheidet, was ich getan habe, ist, dass es die Schlüssel- und Werttypen erzwingt, so dass es besser geeignet ist, stark typisierte Programme zu schreiben. –

+0

Es gibt immer noch das kleine Problem der Strenge. Sie können der Map nach der Erstellung Elemente hinzufügen. – user1740331

Verwandte Themen