Difference between revisions of "VM for transfer"

From Apertium
Jump to navigation Jump to search
Line 19: Line 19:
|-
|-
| chunk || - || N/A || [chunk_name, tag1, tag2, ... , {^... ...$}, num] &rarr; ^chunk_name<tag1>...<tagn>{^... ...$}$ || Pops 'num' amount of data from the stack and creates the chunk, pushes back in the stack
| chunk || - || N/A || [chunk_name, tag1, tag2, ... , {^... ...$}, num] &rarr; ^chunk_name<tag1>...<tagn>{^... ...$}$ || Pops 'num' amount of data from the stack and creates the chunk, pushes back in the stack
|-
| out || - || N/A || [chunk1, chunk2, ..., num] &rarr; [empty] || Pops 'num' amount of data from the stack and puts then in standard output
|-
|-
| jmp || - || N/A || label &rarr; [empty] || Jumps to the label
| jmp || - || N/A || label &rarr; [empty] || Jumps to the label

Revision as of 07:43, 30 May 2010

Instruction Sets

Mnemonic Opcode
(in hex)
Other operands Stack
[before]→[after]
Description
push - value [empty] → value Pushes a value in stack
pushv - var [empty] → value Evaluates the var and pushes its value in stack
pusht - var [empty] → <value> Evaluates the var and pushes its value as a tag in stack
pushbl - N/A [empty] → <blank> pushes a blank in the stack
cliptl - N/A [pos, regex] → value Matches 'regex' in targert language 'pos' and pushes the value in stack
lu - N/A [lemma, tag1, ..., num] → ^(lexical_unit)$ Pops 'num' amount of data from the stack and creates a lexical unit ^... ...$ of of them, pushes the lu back in the stack
brace - N/A [lu1, blank1, lu2, blank2, ..., num] → {... ...} Pops 'num' amount of data from the stack and creates the braced version {... ... ...}, pushes back in the stack
chunk - N/A [chunk_name, tag1, tag2, ... , {^... ...$}, num] → ^chunk_name<tag1>...<tagn>{^... ...$}$ Pops 'num' amount of data from the stack and creates the chunk, pushes back in the stack
out - N/A [chunk1, chunk2, ..., num] → [empty] Pops 'num' amount of data from the stack and puts then in standard output
jmp - N/A label → [empty] Jumps to the label
hlt - N/A Halts the program
return - N/A PC → [empty] Returns from a subroutine

Notes

  • None of the macro and actions need to return anything (unlike conventional functions), so provision for returning a value (using stack) is unnecessary

Sample Translation from XML to byte-code

t1x file

       <out>
         <chunk name="det_det_nom_adj" case="caseFirstWord">
       <tags>
         <tag><lit-tag v="SN"/></tag>
         <tag></tag>
         <tag></tag>
         <tag></tag>
       </tags>
       <lu>
         <clip pos="1" side="tl" part="lem"/>
         <clip pos="1" side="tl" part="a_det"/>
         <clip pos="1" side="tl" part="gen_sense_mf" link-to="3"/>
         <clip pos="1" side="tl" part="gen_mf"/>
         <clip pos="1" side="tl" part="nbr_sense_sp" link-to="4"/>
         <clip pos="1" side="tl" part="nbr_sp"/>
       </lu>
       
       <lu>
         <lit v="el"/>
         <lit-tag v="det.def"/>
         <clip pos="1" side="tl" part="gen_sense_mf" link-to="3"/>
         <lit-tag v="pl"/>
       </lu>
       
       <lu>
         <clip pos="3" side="tl" part="lemh"/>
         <clip pos="3" side="tl" part="a_nom"/>
         <clip pos="3" side="tl" part="gen_sense_mf" link-to="3"/>
         <clip pos="3" side="tl" part="gen_mf"/>
         <clip pos="3" side="tl" part="nbr_sense_sp" link-to="4"/>
         <clip pos="3" side="tl" part="nbr_sp"/>
         <clip pos="3" side="tl" part="lemq"/>
       </lu>
       
       
       <lu>
         
         <clip pos="2" side="tl" part="lemh"/>
         <clip pos="2" side="tl" part="a_adj"/>
         <clip pos="2" side="tl" part="gen_sense_mf" link-to="3"/>
         <clip pos="2" side="tl" part="gen_mf"/>
         <clip pos="2" side="tl" part="nbr_sense_sp" link-to="4"/>
         <clip pos="2" side="tl" part="nbr_sp" link-to="4"/>
         <clip pos="2" side="tl" part="lemq"/>
       </lu>
         </chunk>
       </out>

Corresponding byte-code

push    "det_det_nom_adj"
push    "<SN>"
pusht   tipus_det          ; if operand does not start/end with ", then it's a variable
                           ; first evaluate the variable, append/prepend '<>', then push in the stack
pusht   gen_chunk
pusht   nbr_chunk

push    1
push    "^\w+"             ; lem
cliptl
push    1
push    [regex]            ; a_det
cliptl
push    "<3>"              ; since link-to overrides everything else, we do not need any dedicated instruction
                           ; for that
push    1
push    [regex]            ; gen_mf
cliptl
push    "<4>"
push    1
push    [regex]            ; nbr_sp
cliptl
push    6
lu                         ; pop 6 items, concat, create lexical unit ^...$ and push back in stack

pushbl                     ; push a blank

push    "el"
push    "<det><def>"
push    "<3>"
push    "<pl>"
push    4
lu                         ; pop 4 items from the stack, create a lexical unit ^...$ and then
                           ; push in the stack

pushbl

push   3
push   [regex]             ; lemh
cliptl
push   3
push   [regex]             ; a_nom
cliptl
push   "<3>"
push   3
push   [regex]             ; gen_mf
cliptl
push   "<4>"
push   3
push   [regex]             ; nbr_sp
cliptl
push   3
push   [regex]             ; lemq
cliptl
push   7
lu

pushbl

pushv  adjectiu1           ; its a var, so eval and push the value
push   3
push   [regex]             ; lemh
cliptl
push   3
push   [regex]             ; a_adj
cliptl
push   "<3>"
push   3
push   [regex]             ; gen_mf
cliptl
push   "<4>"
push   "<4>"               ; a bit confused, there are two link-to in the XML
push   3
push   [regex]             ; lemq
cliptl
push   7
lu

push   7                   ; no of blank + lexical unit = 7
brace                      ; pop 7 items, concat, prepend and append {, } then push back

push   6
chunk                      ; create the chunk, ^...{^...$}$, and push back in stack

push   1                   ; number of chunks
out                        ; give output