V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
关于交易安全的提示
在您初次进行交易之前,请点击上面的黄色横条阅读关于交易安全的提示。

为了提高 V2EX 的有效信息质量,在发布交易信息时,除了遵守安全提示中的说明外,也请注意下面的规则:

拼车信息请发到 /go/cosub 节点。

如果没有发送到 /go/cosub,那么会被移动到 /go/pointless。如果持续触发这样的移动,会导致账号被禁用。

beckyho
V2EX  ›  二手交易

有偿实现 rust 实现简单的语法树

  •  
  •   beckyho · 2023-08-04 08:30:57 +08:00 · 916 次点击
    这是一个创建于 478 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需要实现两个类中的方法 expression.rs

    #[derive(PartialEq)] pub enum Expression{}

    impl Display for Expression{ fn fmt(&self, f : &mut std::fmt::Formatter<'_>) -> Result<(), Error>{ unimplemented!() } }

    impl Expression {

    pub fn eval(&self) -> Result<Expression, String>{
        unimplemented!()
    }
    

    }

    parse.rs 类 pub struct Parser {}

    impl Parser { pub fn new(program : &str) -> Self { unimplemented!() }

    pub fn parse(&mut self) -> Result<Expression, String>{
        unimplemented!()
    }
    

    }

    测试用例: #[test] fn parse_var(){ let mut prog = Parser::new(&"x"); let result = prog.parse(); assert!(result.is_ok()); let e = result.unwrap(); assert_eq!("x", format!("{}", e)); }

    #[test]
    fn parse_int(){
        let mut prog = Parser::new(&"123");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("123", format!("{}", e));
    }
    
    #[test]
    fn parse_bool(){
        let mut prog = Parser::new(&"T");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("T", format!("{}", e));
    }
    
    #[test]
    fn parse_plus(){
        let mut prog = Parser::new(&"+(1, 1)");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("1 + 1", format!("{}", e));
    }
    
    #[test]
    fn parse_minus(){
        let mut prog = Parser::new(&"-(1, 1)");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("1 - 1", format!("{}", e));
    }
    
    #[test]
    fn parse_mult(){
        let mut prog = Parser::new(&"*(1, 1)");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("1 * 1", format!("{}", e));
    }
    
    #[test]
    fn parse_div(){
        let mut prog = Parser::new(&"/(1, 1)");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("1 / 1", format!("{}", e));
    }
    
    #[test]
    fn parse_lt(){
        let mut prog = Parser::new(&"<(1, 1)");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("1 < 1", format!("{}", e));
    }
    
    #[test]
    fn parse_not(){
        let mut prog = Parser::new(&"!T");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("!T", format!("{}", e));
    }
    
    #[test]
    fn parse_eq(){
        let mut prog = Parser::new(&"=(1, 1)");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("1 = 1", format!("{}", e));
    }
    
    #[test]
    fn parse_func(){
        let mut prog = Parser::new(&"func x => T");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("func x => T", format!("{}", e));
    }
    
    #[test]
    fn parse_app(){
        let mut prog = Parser::new(&"apply(func x => x, 1)");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("func x => x (1)", format!("{}", e));
    }
    
    #[test]
    fn parse_if(){
        let mut prog = Parser::new(&"if <(1, 5) then 8 else 9");
        let result = prog.parse();
        assert!(result.is_ok());
        let e = result.unwrap();
        assert_eq!("if 1 < 5 then 8 else 9", format!("{}", e));
    }
    

    要求,通过测试用例即可,最好今天能完成。有意联系 @abcdef_d

    wjx0912
        1
    wjx0912  
       2023-08-04 09:03:38 +08:00
    好奇的问下付款方式,先给钱还是先给源码
    beckyho
        2
    beckyho  
    OP
       2023-08-04 09:13:09 +08:00
    @wjx0912 付款走咸鱼,你先远程操作我看下实现的功能,没问题的话走咸鱼交易
    hanssx
        3
    hanssx  
       2023-08-04 09:52:23 +08:00 via iPhone
    话说有个 ruff 插件,是不是里面有 ast 的生成?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2725 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:21 · PVG 18:21 · LAX 02:21 · JFK 05:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.