fn main( ) {
let line = read_line( ) ;
let por = parse( & line) ;
print_casl2( por) ;
}
fn read_line( ) -> String {
let mut line = String:: new ( ) ;
std:: io :: stdin ( ) .read_line ( & mut line) .unwrap ( ) ;
println! ( "{}" , line.trim ( ) ) ;
for ch in "()+-*" .chars ( ) {
use std:: iter :: FromIterator ;
line = line.replace ( ch, & String:: from_iter ( & [ ' ' , ch, ' ' ] ) ) ;
}
println! ( "{}" , line.trim ( ) ) ;
line
}
fn parse( line: & str) -> Vec<& str> {
let mut ops = vec! [ ] ;
let mut por = vec! [ ] ;
for token in line.split_whitespace ( ) {
match token {
"(" => {
ops.push ( token) ;
}
")" => {
while let Some( token) = ops.pop ( ) {
if token == "(" {
break ;
}
por.push ( token) ;
}
}
"+" | "-" => {
while let Some( token) = ops.pop ( ) {
if token == "(" {
ops.push ( token) ;
break ;
}
por.push ( token) ;
}
ops.push ( token) ;
}
"*" => {
while let Some( token) = ops.pop ( ) {
if token != "*" {
ops.push ( token) ;
break ;
}
por.push ( token) ;
}
ops.push ( token) ;
}
_ => {
por.push ( token) ;
}
}
}
ops.reverse ( ) ;
por.append ( & mut ops) ;
println! ( "{}" , por.join ( " " ) ) ;
por
}
fn print_casl2( por: Vec<& str> ) {
let is_op = | token| match token {
"+" | "-" | "*" => true ,
_ => false ,
} ;
let is_digit = | token: & str| token.chars ( ) .all ( | c| c.is_ascii_digit ( ) ) ;
let print_op = | token, r| match token {
"+" => println! ( " ADDL GR{},GR{}" , r + 1 , 2 - r) ,
"-" => println! ( " SUBL GR{},GR{}" , r + 1 , 2 - r) ,
"*" => {
println! ( " CALL MUL" ) ;
println! ( " LD GR{},GR0" , r + 1 ) ;
}
_ => { }
} ;
let mut var = std:: collections :: BTreeSet :: new ( ) ;
for token in & por {
if ! is_op( token) && ! is_digit( token) {
var.insert ( * token) ;
}
}
println! ( "FOO START" ) ;
for token in & var {
println! ( " LD GR0,='{}'" , token) ;
println! ( " ST GR0,STR" ) ;
println! ( " LD GR0,={}" , token.len ( ) ) ;
println! ( " ST GR0,LEN" ) ;
println! ( " OUT STR,LEN" ) ;
println! ( " CALL RED" ) ;
println! ( " ST GR0,{}" , token) ;
}
let mut stk = vec! [ ] ;
let mut reg = [ None, None] ;
let mut r = 0 ;
for token in por {
match token {
"+" | "-" | "*" => {
if let Some( gr) = reg[ r] {
if is_digit( gr) {
println! ( " LAD GR{},{}" , r + 1 , gr) ;
} else if ! is_op( gr) {
println! ( " LD GR{},{}" , r + 1 , gr) ;
}
} else if let Some( gr) = stk.pop ( ) {
if is_op( gr) {
println! ( " POP GR{}" , r + 1 ) ;
} else if is_digit( gr) {
println! ( " LAD GR{},{}" , r + 1 , gr) ;
} else {
println! ( " LD GR{},{}" , r + 1 , gr) ;
}
}
if let Some( gr) = reg[ 1 - r] {
if is_digit( gr) {
println! ( " LAD GR{},{}" , 2 - r, gr) ;
} else if ! is_op( gr) {
println! ( " LD GR{},{}" , 2 - r, gr) ;
}
}
reg[ 1 - r] = None;
print_op( token, r) ;
}
_ => {
if let Some( gr) = reg[ r] {
if is_op( gr) {
println! ( " PUSH 0,GR{}" , r + 1 ) ;
}
stk.push ( gr) ;
}
}
}
reg[ r] = Some( token) ;
r = 1 - r;
}
println! ( " LD GR0,GR{}" , 2 - r) ;
println! ( " RET" ) ;
println! ( "MUL XOR GR0,GR0" ) ;
println! ( "TOP SRL GR1,1" ) ;
println! ( " JOV ADD" ) ;
println! ( " JNZ NXT" ) ;
println! ( " RET" ) ;
println! ( "ADD ADDL GR0,GR2" ) ;
println! ( "NXT SLL GR2,1" ) ;
println! ( " JUMP TOP" ) ;
println! ( "RED IN STR,LEN" ) ;
println! ( " XOR GR0,GR0" ) ;
println! ( " XOR GR1,GR1" ) ;
println! ( "LOP CPL GR1,LEN" ) ;
println! ( " JNZ RCH" ) ;
println! ( " RET" ) ;
println! ( "RCH LD GR2,GR0" ) ;
println! ( " SLL GR0,1" ) ;
println! ( " SLL GR2,3" ) ;
println! ( " ADDL GR0,GR2" ) ;
println! ( " ADDL GR0,STR,GR1" ) ;
println! ( " SUBL GR0,='0'" ) ;
println! ( " LAD GR1,1,GR1" ) ;
println! ( " JUMP LOP" ) ;
println! ( "LEN DS 1" ) ;
println! ( "STR DS 5" ) ;
for token in var {
println! ( "{:3} DS 1" , token) ;
}
println! ( " END" ) ;
}
Zm4gbWFpbigpIHsKICAgIGxldCBsaW5lID0gcmVhZF9saW5lKCk7CiAgICBsZXQgcG9yID0gcGFyc2UoJmxpbmUpOwoKICAgIHByaW50X2Nhc2wyKHBvcik7Cn0KCmZuIHJlYWRfbGluZSgpIC0+IFN0cmluZyB7CiAgICBsZXQgbXV0IGxpbmUgPSBTdHJpbmc6Om5ldygpOwogICAgc3RkOjppbzo6c3RkaW4oKS5yZWFkX2xpbmUoJm11dCBsaW5lKS51bndyYXAoKTsKICAgIHByaW50bG4hKCJ7fSIsIGxpbmUudHJpbSgpKTsKCiAgICBmb3IgY2ggaW4gIigpKy0qIi5jaGFycygpIHsKICAgICAgICB1c2Ugc3RkOjppdGVyOjpGcm9tSXRlcmF0b3I7CiAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShjaCwgJlN0cmluZzo6ZnJvbV9pdGVyKCZbJyAnLCBjaCwgJyAnXSkpOwogICAgfQogICAgcHJpbnRsbiEoInt9IiwgbGluZS50cmltKCkpOwoKICAgIGxpbmUKfQoKZm4gcGFyc2UobGluZTogJnN0cikgLT4gVmVjPCZzdHI+IHsKICAgIGxldCBtdXQgb3BzID0gdmVjIVtdOwogICAgbGV0IG11dCBwb3IgPSB2ZWMhW107CiAgICBmb3IgdG9rZW4gaW4gbGluZS5zcGxpdF93aGl0ZXNwYWNlKCkgewogICAgICAgIG1hdGNoIHRva2VuIHsKICAgICAgICAgICAgIigiID0+IHsKICAgICAgICAgICAgICAgIG9wcy5wdXNoKHRva2VuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAiKSIgPT4gewogICAgICAgICAgICAgICAgd2hpbGUgbGV0IFNvbWUodG9rZW4pID0gb3BzLnBvcCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAiKCIgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcG9yLnB1c2godG9rZW4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICIrIiB8ICItIiA9PiB7CiAgICAgICAgICAgICAgICB3aGlsZSBsZXQgU29tZSh0b2tlbikgPSBvcHMucG9wKCkgewogICAgICAgICAgICAgICAgICAgIGlmIHRva2VuID09ICIoIiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wcy5wdXNoKHRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBvci5wdXNoKHRva2VuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9wcy5wdXNoKHRva2VuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAiKiIgPT4gewogICAgICAgICAgICAgICAgd2hpbGUgbGV0IFNvbWUodG9rZW4pID0gb3BzLnBvcCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiAhPSAiKiIgewogICAgICAgICAgICAgICAgICAgICAgICBvcHMucHVzaCh0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwb3IucHVzaCh0b2tlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvcHMucHVzaCh0b2tlbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgXyA9PiB7CiAgICAgICAgICAgICAgICBwb3IucHVzaCh0b2tlbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgb3BzLnJldmVyc2UoKTsKICAgIHBvci5hcHBlbmQoJm11dCBvcHMpOwogICAgcHJpbnRsbiEoInt9IiwgcG9yLmpvaW4oIiAiKSk7CgogICAgcG9yCn0KCmZuIHByaW50X2Nhc2wyKHBvcjogVmVjPCZzdHI+KSB7CiAgICBsZXQgaXNfb3AgPSB8dG9rZW58IG1hdGNoIHRva2VuIHsKICAgICAgICAiKyIgfCAiLSIgfCAiKiIgPT4gdHJ1ZSwKICAgICAgICBfID0+IGZhbHNlLAogICAgfTsKICAgIGxldCBpc19kaWdpdCA9IHx0b2tlbjogJnN0cnwgdG9rZW4uY2hhcnMoKS5hbGwofGN8IGMuaXNfYXNjaWlfZGlnaXQoKSk7CiAgICBsZXQgcHJpbnRfb3AgPSB8dG9rZW4sIHJ8IG1hdGNoIHRva2VuIHsKICAgICAgICAiKyIgPT4gcHJpbnRsbiEoIiAgICBBRERMICAgR1J7fSxHUnt9IiwgciArIDEsIDIgLSByKSwKICAgICAgICAiLSIgPT4gcHJpbnRsbiEoIiAgICBTVUJMICAgR1J7fSxHUnt9IiwgciArIDEsIDIgLSByKSwKICAgICAgICAiKiIgPT4gewogICAgICAgICAgICBwcmludGxuISgiICAgIENBTEwgICBNVUwiKTsKICAgICAgICAgICAgcHJpbnRsbiEoIiAgICBMRCAgICAgR1J7fSxHUjAiLCByICsgMSk7CiAgICAgICAgfQogICAgICAgIF8gPT4ge30KICAgIH07CiAgICBsZXQgbXV0IHZhciA9IHN0ZDo6Y29sbGVjdGlvbnM6OkJUcmVlU2V0OjpuZXcoKTsKICAgIGZvciB0b2tlbiBpbiAmcG9yIHsKICAgICAgICBpZiAhaXNfb3AodG9rZW4pICYmICFpc19kaWdpdCh0b2tlbikgewogICAgICAgICAgICB2YXIuaW5zZXJ0KCp0b2tlbik7CiAgICAgICAgfQogICAgfQogICAgcHJpbnRsbiEoIkZPTyBTVEFSVCIpOwogICAgZm9yIHRva2VuIGluICZ2YXIgewogICAgICAgIHByaW50bG4hKCIgICAgTEQgICAgIEdSMCw9J3t9JyIsIHRva2VuKTsKICAgICAgICBwcmludGxuISgiICAgIFNUICAgICBHUjAsU1RSIik7CiAgICAgICAgcHJpbnRsbiEoIiAgICBMRCAgICAgR1IwLD17fSIsIHRva2VuLmxlbigpKTsKICAgICAgICBwcmludGxuISgiICAgIFNUICAgICBHUjAsTEVOIik7CiAgICAgICAgcHJpbnRsbiEoIiAgICBPVVQgICAgU1RSLExFTiIpOwogICAgICAgIHByaW50bG4hKCIgICAgQ0FMTCAgIFJFRCIpOwogICAgICAgIHByaW50bG4hKCIgICAgU1QgICAgIEdSMCx7fSIsIHRva2VuKTsKICAgIH0KCiAgICBsZXQgbXV0IHN0ayA9IHZlYyFbXTsKICAgIGxldCBtdXQgcmVnID0gW05vbmUsIE5vbmVdOwogICAgbGV0IG11dCByID0gMDsKICAgIGZvciB0b2tlbiBpbiBwb3IgewogICAgICAgIG1hdGNoIHRva2VuIHsKICAgICAgICAgICAgIisiIHwgIi0iIHwgIioiID0+IHsKICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKGdyKSA9IHJlZ1tyXSB7CiAgICAgICAgICAgICAgICAgICAgaWYgaXNfZGlnaXQoZ3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiEoIiAgICBMQUQgICAgR1J7fSx7fSIsIHIgKyAxLCBncik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICFpc19vcChncikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiICAgIExEICAgICBHUnt9LHt9IiwgciArIDEsIGdyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgbGV0IFNvbWUoZ3IpID0gc3RrLnBvcCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiBpc19vcChncikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiICAgIFBPUCAgICBHUnt9IiwgciArIDEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBpc19kaWdpdChncikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiICAgIExBRCAgICBHUnt9LHt9IiwgciArIDEsIGdyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiICAgIExEICAgICBHUnt9LHt9IiwgciArIDEsIGdyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiBsZXQgU29tZShncikgPSByZWdbMSAtIHJdIHsKICAgICAgICAgICAgICAgICAgICBpZiBpc19kaWdpdChncikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiICAgIExBRCAgICBHUnt9LHt9IiwgMiAtIHIsIGdyKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgIWlzX29wKGdyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bG4hKCIgICAgTEQgICAgIEdSe30se30iLCAyIC0gciwgZ3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlZ1sxIC0gcl0gPSBOb25lOwogICAgICAgICAgICAgICAgcHJpbnRfb3AodG9rZW4sIHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF8gPT4gewogICAgICAgICAgICAgICAgaWYgbGV0IFNvbWUoZ3IpID0gcmVnW3JdIHsKICAgICAgICAgICAgICAgICAgICBpZiBpc19vcChncikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgiICAgIFBVU0ggICAwLEdSe30iLCByICsgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0ay5wdXNoKGdyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZWdbcl0gPSBTb21lKHRva2VuKTsKICAgICAgICByID0gMSAtIHI7CiAgICB9CgogICAgcHJpbnRsbiEoIiAgICBMRCAgICAgR1IwLEdSe30iLCAyIC0gcik7CiAgICBwcmludGxuISgiICAgIFJFVCIpOwoKICAgIHByaW50bG4hKCJNVUwgWE9SICAgIEdSMCxHUjAiKTsKICAgIHByaW50bG4hKCJUT1AgU1JMICAgIEdSMSwxIik7CiAgICBwcmludGxuISgiICAgIEpPViAgICBBREQiKTsKICAgIHByaW50bG4hKCIgICAgSk5aICAgIE5YVCIpOwogICAgcHJpbnRsbiEoIiAgICBSRVQiKTsKICAgIHByaW50bG4hKCJBREQgQURETCAgIEdSMCxHUjIiKTsKICAgIHByaW50bG4hKCJOWFQgU0xMICAgIEdSMiwxIik7CiAgICBwcmludGxuISgiICAgIEpVTVAgICBUT1AiKTsKCiAgICBwcmludGxuISgiUkVEIElOICAgICBTVFIsTEVOIik7CiAgICBwcmludGxuISgiICAgIFhPUiAgICBHUjAsR1IwIik7CiAgICBwcmludGxuISgiICAgIFhPUiAgICBHUjEsR1IxIik7CiAgICBwcmludGxuISgiTE9QIENQTCAgICBHUjEsTEVOIik7CiAgICBwcmludGxuISgiICAgIEpOWiAgICBSQ0giKTsKICAgIHByaW50bG4hKCIgICAgUkVUIik7CiAgICBwcmludGxuISgiUkNIIExEICAgICBHUjIsR1IwIik7CiAgICBwcmludGxuISgiICAgIFNMTCAgICBHUjAsMSIpOwogICAgcHJpbnRsbiEoIiAgICBTTEwgICAgR1IyLDMiKTsKICAgIHByaW50bG4hKCIgICAgQURETCAgIEdSMCxHUjIiKTsKICAgIHByaW50bG4hKCIgICAgQURETCAgIEdSMCxTVFIsR1IxIik7CiAgICBwcmludGxuISgiICAgIFNVQkwgICBHUjAsPScwJyIpOwogICAgcHJpbnRsbiEoIiAgICBMQUQgICAgR1IxLDEsR1IxIik7CiAgICBwcmludGxuISgiICAgIEpVTVAgICBMT1AiKTsKICAgIHByaW50bG4hKCJMRU4gRFMgICAgIDEiKTsKICAgIHByaW50bG4hKCJTVFIgRFMgICAgIDUiKTsKCiAgICBmb3IgdG9rZW4gaW4gdmFyIHsKICAgICAgICBwcmludGxuISgiezozfSBEUyAgICAgMSIsIHRva2VuKTsKICAgIH0KCiAgICBwcmludGxuISgiICAgIEVORCIpOwp9Cg==
stdout
(12+A*5+U) * ((7-B)-(2+X)) * 4
( 12 + A * 5 + U ) * ( ( 7 - B ) - ( 2 + X ) ) * 4
12 A 5 * + U + 7 B - 2 X + - * 4 *
FOO START
LD GR0,='A'
ST GR0,STR
LD GR0,=1
ST GR0,LEN
OUT STR,LEN
CALL RED
ST GR0,A
LD GR0,='B'
ST GR0,STR
LD GR0,=1
ST GR0,LEN
OUT STR,LEN
CALL RED
ST GR0,B
LD GR0,='U'
ST GR0,STR
LD GR0,=1
ST GR0,LEN
OUT STR,LEN
CALL RED
ST GR0,U
LD GR0,='X'
ST GR0,STR
LD GR0,=1
ST GR0,LEN
OUT STR,LEN
CALL RED
ST GR0,X
LD GR2,A
LAD GR1,5
CALL MUL
LD GR2,GR0
LAD GR1,12
ADDL GR1,GR2
LD GR2,U
ADDL GR1,GR2
PUSH 0,GR1
LAD GR2,7
LD GR1,B
SUBL GR2,GR1
PUSH 0,GR2
LAD GR1,2
LD GR2,X
ADDL GR1,GR2
POP GR2
SUBL GR2,GR1
POP GR1
CALL MUL
LD GR1,GR0
LAD GR2,4
CALL MUL
LD GR1,GR0
LD GR0,GR1
RET
MUL XOR GR0,GR0
TOP SRL GR1,1
JOV ADD
JNZ NXT
RET
ADD ADDL GR0,GR2
NXT SLL GR2,1
JUMP TOP
RED IN STR,LEN
XOR GR0,GR0
XOR GR1,GR1
LOP CPL GR1,LEN
JNZ RCH
RET
RCH LD GR2,GR0
SLL GR0,1
SLL GR2,3
ADDL GR0,GR2
ADDL GR0,STR,GR1
SUBL GR0,='0'
LAD GR1,1,GR1
JUMP LOP
LEN DS 1
STR DS 5
A DS 1
B DS 1
U DS 1
X DS 1
END