t64/parser.rb
2020-06-21 14:14:57 -05:00

592 lines
15 KiB
Ruby

#
# DO NOT MODIFY!!!!
# This file is automatically generated by Racc 1.4.14
# from Racc grammer file "".
#
require 'racc/parser.rb'
class T64 < Racc::Parser
module_eval(<<'...end t64.y/module_eval...', 't64.y', 64)
def parse(input)
scan_str(input)
end
def get_label(label)
if @labels[label]
return make_bytes(@labels[label])
else
return [label]+[0]*7
end
end
def make_bytes(val)
bytes=[]
8.times do |i|
mask=0xFF << i*8
byte=(val&mask) >> i*8
bytes.push byte
end
return bytes
end
def defed_label(label)
newcode=[]
for line in @code
for index in line.each_index.select {|index| line[index]==label}
line[index,8]=make_bytes(@labels[label])
end
newcode.push line
end
@code=newcode
end
...end t64.y/module_eval...
##### State transition tables begin ###
racc_action_table = [
14, 86, 46, 84, 47, 85, 15, 16, 17, 43,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 14, 72, 82, 70, 83, 71,
15, 16, 17, 44, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 75, 67,
45, 103, 68, 76, 104, 74, 92, 50, -4, 93,
6, 7, 48, 51, 49, 6, 7, 6, 7, 52,
53, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 69, 73, 77, 78, 79, 80, 81,
87, 88, 89, 90, 91, 94, 95, 96, 97, 98,
99, 100, 101, 102, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
141, 142, 143, 144, 3, 145, 9, 10, -7, 12,
-10, 35, 36, 37, 38, 39, 40, 41, 42 ]
racc_action_check = [
8, 64, 25, 64, 25, 64, 8, 8, 8, 22,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 34, 55, 63, 55, 63, 55,
34, 34, 34, 23, 34, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 34, 34, 57, 48,
24, 84, 48, 57, 84, 57, 70, 27, 10, 70,
10, 10, 26, 29, 26, 11, 11, 2, 2, 30,
31, 35, 36, 37, 38, 39, 40, 41, 42, 43,
44, 45, 46, 50, 56, 58, 59, 60, 61, 62,
65, 66, 67, 68, 69, 72, 76, 77, 78, 79,
80, 81, 82, 83, 85, 86, 91, 92, 93, 94,
95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 110, 112, 113, 114, 115, 116, 118,
121, 122, 125, 126, 127, 128, 129, 133, 134, 135,
136, 138, 139, 140, 1, 141, 3, 5, 6, 7,
12, 14, 15, 16, 17, 18, 19, 20, 21 ]
racc_action_pointer = [
nil, 144, 65, 146, nil, 145, 148, 145, -5, nil,
58, 63, 148, nil, 145, 146, 147, 148, 149, 150,
151, 152, 3, 27, 42, -6, 54, 51, nil, 53,
59, 60, nil, nil, 19, 64, 65, 66, 67, 68,
69, 70, 71, 72, 73, 78, 79, nil, 46, nil,
76, nil, nil, nil, nil, 19, 74, 45, 79, 80,
81, 82, 83, 18, -5, 81, 82, 83, 84, 86,
53, nil, 87, nil, nil, nil, 93, 90, 91, 92,
93, 94, 96, 95, 48, 96, 97, nil, nil, nil,
nil, 103, 98, 99, 103, 101, 105, 102, 107, 104,
109, 107, 114, 109, 110, 117, 115, 113, nil, nil,
114, nil, 117, 118, 119, 120, 121, nil, 120, nil,
nil, 121, 122, nil, nil, 118, 119, 120, 121, 122,
nil, nil, nil, 130, 131, 132, 133, nil, 131, 132,
133, 135, nil, nil, nil, nil ]
racc_action_default = [
-1, -43, -11, -43, -2, -43, -5, -43, -43, 146,
-11, -11, -8, -12, -43, -43, -43, -43, -43, -43,
-43, -43, -43, -43, -43, -43, -43, -43, -39, -43,
-43, -43, -3, -6, -43, -43, -43, -43, -43, -43,
-43, -43, -43, -43, -43, -43, -43, -37, -43, -36,
-43, -40, -41, -42, -9, -43, -43, -43, -43, -43,
-43, -43, -43, -43, -43, -43, -43, -43, -43, -43,
-43, -14, -43, -17, -18, -19, -43, -43, -43, -43,
-43, -43, -43, -43, -43, -43, -43, -32, -33, -34,
-35, -43, -43, -43, -43, -43, -43, -43, -43, -43,
-43, -43, -43, -43, -43, -43, -43, -43, -13, -16,
-43, -20, -43, -43, -43, -43, -43, -26, -43, -28,
-31, -43, -43, -38, -15, -43, -43, -43, -43, -43,
-27, -29, -30, -43, -43, -43, -43, -25, -43, -43,
-43, -43, -21, -22, -23, -24 ]
racc_goto_table = [
13, 4, 1, 2, 11, 34, nil, nil, nil, 32,
33, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, 54 ]
racc_goto_check = [
6, 2, 1, 3, 5, 7, nil, nil, nil, 2,
2, nil, nil, nil, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, 6 ]
racc_goto_pointer = [
nil, 2, -1, 3, nil, -2, -8, -7, nil ]
racc_goto_default = [
nil, nil, nil, nil, 5, nil, nil, nil, 8 ]
racc_reduce_table = [
0, 0, :racc_error,
0, 32, :_reduce_1,
2, 30, :_reduce_2,
3, 31, :_reduce_3,
2, 31, :_reduce_4,
0, 34, :_reduce_5,
3, 31, :_reduce_6,
1, 31, :_reduce_7,
0, 36, :_reduce_8,
4, 33, :_reduce_9,
2, 33, :_reduce_10,
0, 37, :_reduce_11,
2, 33, :_reduce_12,
6, 35, :_reduce_13,
4, 35, :_reduce_14,
7, 35, :_reduce_15,
6, 35, :_reduce_16,
4, 35, :_reduce_17,
4, 35, :_reduce_18,
4, 35, :_reduce_19,
6, 35, :_reduce_20,
10, 35, :_reduce_21,
10, 35, :_reduce_22,
10, 35, :_reduce_23,
10, 35, :_reduce_24,
8, 35, :_reduce_25,
6, 35, :_reduce_26,
7, 35, :_reduce_27,
6, 35, :_reduce_28,
7, 35, :_reduce_29,
7, 35, :_reduce_30,
6, 35, :_reduce_31,
4, 35, :_reduce_32,
4, 35, :_reduce_33,
4, 35, :_reduce_34,
4, 35, :_reduce_35,
2, 35, :_reduce_36,
2, 35, :_reduce_37,
6, 35, :_reduce_38,
1, 35, :_reduce_39,
2, 35, :_reduce_40,
2, 35, :_reduce_41,
2, 35, :_reduce_42 ]
racc_reduce_n = 43
racc_shift_n = 146
racc_token_table = {
false => 0,
:error => 1,
:NEWLINE => 2,
:IDENT => 3,
:COLON => 4,
:LDB => 5,
:REG => 6,
:COMMA => 7,
:LPAREN => 8,
:RPAREN => 9,
:NUM => 10,
:LDW => 11,
:LD => 12,
:ARB => 13,
:AROP => 14,
:ARIB => 15,
:ARW => 16,
:ARI => 17,
:AR => 18,
:ST => 19,
:STB => 20,
:JNC => 21,
:JNZ => 22,
:JMP => 23,
:JST => 24,
:HLT => 25,
:DB => 26,
:DQW => 27,
:ORG => 28 }
racc_nt_base = 29
racc_use_result_var = true
Racc_arg = [
racc_action_table,
racc_action_check,
racc_action_default,
racc_action_pointer,
racc_goto_table,
racc_goto_check,
racc_goto_default,
racc_goto_pointer,
racc_nt_base,
racc_reduce_table,
racc_token_table,
racc_shift_n,
racc_reduce_n,
racc_use_result_var ]
Racc_token_to_s_table = [
"$end",
"error",
"NEWLINE",
"IDENT",
"COLON",
"LDB",
"REG",
"COMMA",
"LPAREN",
"RPAREN",
"NUM",
"LDW",
"LD",
"ARB",
"AROP",
"ARIB",
"ARW",
"ARI",
"AR",
"ST",
"STB",
"JNC",
"JNZ",
"JMP",
"JST",
"HLT",
"DB",
"DQW",
"ORG",
"$start",
"start",
"program",
"@1",
"line",
"@2",
"ins",
"@3",
"@4" ]
Racc_debug_parser = false
##### State transition tables end #####
# reduce 0 omitted
module_eval(<<'.,.,', 't64.y', 3)
def _reduce_1(val, _values, result)
@code=[]
@labels={}
@ops=["NOT","AND","OR","ADD","SUB","MULL","MULH","MULUL","MULUH",
"DIVL","DIVH","DIVUL","DIVUH","NEG","CMP","ADC","SBB"]
@pos=0
@backpatches={}
@linestarts=[]
@lineends=[]
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 11)
def _reduce_2(val, _values, result)
return @code,@labels,@linestarts,@lineends
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 12)
def _reduce_3(val, _values, result)
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 12)
def _reduce_4(val, _values, result)
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 12)
def _reduce_5(val, _values, result)
@linestarts.push @pos;@lineends.push @pos
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 12)
def _reduce_6(val, _values, result)
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 12)
def _reduce_7(val, _values, result)
@linestarts.push @pos;@lineends.push @pos
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 13)
def _reduce_8(val, _values, result)
@startpos=@pos
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 14)
def _reduce_9(val, _values, result)
@labels[val[0]]=@startpos
defed_label(val[0])
@linestarts.push @startpos
@lineends.push @pos
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 20)
def _reduce_10(val, _values, result)
@labels[val[0]]=@pos
defed_label(val[0])
@linestarts.push @pos
@lineends.push @pos
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 25)
def _reduce_11(val, _values, result)
@startpos=@pos
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 26)
def _reduce_12(val, _values, result)
@linestarts.push @startpos
@lineends.push @pos
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 29)
def _reduce_13(val, _values, result)
@code.push([0x0,0x10|val[1],0x0,*get_label(val[4])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 30)
def _reduce_14(val, _values, result)
@code.push([0x0,val[1],0x0,*val[3][0,1]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 31)
def _reduce_15(val, _values, result)
@code.push([0x0,0x30|val[1],val[3]<<4|val[5],*val[3,1]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 32)
def _reduce_16(val, _values, result)
@code.push([0x0,0x20|val[1],val[4]<<4]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 33)
def _reduce_17(val, _values, result)
@code.push([0x1,val[1],0x0,*val[3][0,2]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 34)
def _reduce_18(val, _values, result)
@code.push([0x03,val[1],0x0,*val[3]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 35)
def _reduce_19(val, _values, result)
@code.push([0x03,val[1],0x0,*get_label(val[3])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 36)
def _reduce_20(val, _values, result)
@code.push([0x03,0x10|val[1],0x0,*get_label(val[4])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 37)
def _reduce_21(val, _values, result)
@code.push([0x8,0x70|val[1],(val[3]<<4)|val[5],@ops.index(val[7])|(val[9][0]<<7)]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 38)
def _reduce_22(val, _values, result)
@code.push([0x8,0x80|val[1],(val[3]<<4),@ops.index(val[7]),val[5][0]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 39)
def _reduce_23(val, _values, result)
@code.push([0x9,0x70|val[1],(val[3]<<4)|val[5],@ops.index(val[7])|(val[9][0]<<7)]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 40)
def _reduce_24(val, _values, result)
@code.push([0xb,0x80|val[1],(val[3]<<4),@ops.index(val[7])|((val[9][0])<<7),*val[5]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 41)
def _reduce_25(val, _values, result)
@code.push([0xb,0x70|val[1],(val[3]<<4)|val[5],@ops.index(val[7])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 42)
def _reduce_26(val, _values, result)
@code.push([0x7,0x20,(val[4]<<4|val[1])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 43)
def _reduce_27(val, _values, result)
@code.push([0x7,0x40,val[1],*get_label(val[5]),*val[3][0,4]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 44)
def _reduce_28(val, _values, result)
@code.push([0x4,0x10,val[1],*get_label(val[4])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 45)
def _reduce_29(val, _values, result)
@code.push([0x4,0x90,val[1],*get_label(val[5]),*val[3][0,4]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 46)
def _reduce_30(val, _values, result)
@code.push([0x4,0x20,(val[5]<<4|val[1]),val[3]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 47)
def _reduce_31(val, _values, result)
@code.push([0x4,0x20,(val[4]<<4)|val[1]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 48)
def _reduce_32(val, _values, result)
@code.push([0x10,0x10,0x0,*get_label(val[2])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 49)
def _reduce_33(val, _values, result)
@code.push([0xe,0x10,0x0,*get_label(val[2])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 50)
def _reduce_34(val, _values, result)
@code.push([0xc,0x10,0x0,*get_label(val[2])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 51)
def _reduce_35(val, _values, result)
@code.push([0xc,0x20,val[2]<<4]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 52)
def _reduce_36(val, _values, result)
@code.push([0xc,0x10,0x0,*val[1]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 53)
def _reduce_37(val, _values, result)
@code.push([0xe,0x10,0x0,*val[1]]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 54)
def _reduce_38(val, _values, result)
@code.push([0x11,0x10|val[1],0x0,*get_label(val[4])]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 55)
def _reduce_39(val, _values, result)
@code.push([0xFF]);@pos+=0x10
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 56)
def _reduce_40(val, _values, result)
@code.push([*val[1][0,1]]);@pos+=1
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 57)
def _reduce_41(val, _values, result)
@code.push([*val[1]]);@pos+=8
result
end
.,.,
module_eval(<<'.,.,', 't64.y', 58)
def _reduce_42(val, _values, result)
@pos=val[1].pack("C*").unpack("Q<")
result
end
.,.,
def _reduce_none(val, _values, result)
val[0]
end
end # class T64