IT’s Portfolio

[Rust] How to study Rust? - "Copycat" (6) 본문

Development Study/Rust

[Rust] How to study Rust? - "Copycat" (6)

f1r3_r41n 2023. 9. 24. 13:59
728x90
반응형

구조체로 예약 단어 및 길이 정의 후 입력 텍스트 파일의 각 줄에 나타나는 단어들에 대하여 "줄번호-위치-단어-해당 길이" 출력(예약되지 않은 단어가 나타나면 "Undefined word" 메시지 출력 후 무시)


입력 파일

command.s
47 B


소스 코드

use std::{fs, io::Read, error::Error, process};

struct Optab<'a> {
    name: &'a str,
    len: i32,
}

impl<'a> Optab<'a> {
    fn new(name: &'a str, len: i32) -> Optab<'a> {
        Optab { name, len }
    }
}

fn read_file() -> Result<String, Box<dyn Error>> {
    let mut f = fs::File::open("command.s")?;
    let mut buf = String::new();
    f.read_to_string(&mut buf)?;
    Ok(buf)
}

fn word_checking(contents: String) {
    let mut location = 0;
    let mut l = 1;
    let wordtab: Vec<Optab> = vec![
        Optab::new("LDA", 3), Optab::new("STA", 4), Optab::new("ADD", 5),
        Optab::new("TIX", 2), Optab::new("CMP", 6)
    ];
    for word in contents.lines() {
        let mut checker = true;
        for x in wordtab.iter() {
            if x.name == word {
                println!(
                    "{l:>2}, {location:02X}, {}, {:#02}",
                    x.name, x.len
                );
                location+=x.len;
                l+=1;
                checker = false;
                break;
            }
        }
        if checker == true {
            println!(" Undefined word");
        }
    }
}

fn main() {
    let contents = read_file().unwrap_or_else(
        |err| {
            eprintln!("Error!\n{err}");
            process::exit(1);
        }
    );
    word_checking(contents);
}

결과

 1, 00, STA, 04
 2, 04, LDA, 03
 3, 07, TIX, 02
 4, 09, LDA, 03
 5, 0C, STA, 04
 6, 10, CMP, 06
 7, 16, LDA, 03
 Undefined word
 8, 19, ADD, 05
 9, 1E, TIX, 02
10, 20, CMP, 06
11, 26, ADD, 05

출처

728x90
반응형
Comments