• 词法分析器


    词法分析器

    函数

    • skip_one_line: 跳过一行, 会在skip_comment中注释为//的时候调用
    • skip_comment: // 和 /**/
    • skip_blanks: 跳过空白行, 会在skip_comment处理完注释之后调用, 同时在get_next_token这个核心的词法分析器的接口函数中调用防止获取到的token含有空白字符
    • to_next_char: 将parser中的next_char_ptr指向的字符赋给cur_char, 并++next_char_ptr
    • to_next_char_if: 和to_next_char类似, 返回类型为bool类型, 当nextchar是我们期望的值的时候调用to_next_char并返回true, 否则直接返回false
    • peek_next_char: *parser->next_char_ptr
    • peek_cur_char: parser->cur_char
    • get_next_token: 给语法分析器调用的函数, 在get_next_token函数中主要由一个伪while循环(之所以是伪while循环, 是因为在while的结尾有return语句), 里面还有continue语句, 主要在遇到了注释, 调用了skip_comment之后continue继续获取Token, 因为注释并不是我们的token, 它是无用的; 在while中有switch case语句, 主要是通过字符判断token的类型, 这是parser->cur_token.type的值
    • parser_id: 解析id, 在该函数中, 会调用is_id_or_keyword, 来判断TokenType到底是id还是keyword
    • is_id_or_keyword: 会在parser_id中调用
    • parser_string: 解析字符串, 注意转义字符的处理, 有switch case

    数据结构

    • Parser, 词法解析器
    
    typedef Parser {
        const char *fname;
        const char *source;
        Token cur_token; // 不会为cur_token和pre_token赋整个的值, 而是一直在不断的更新cur_token的属性, 而pre_token则是直接通过cur_token拷贝过来的
        Token pre_token;
        char cur_char;
        char *next_char_ptr;
        VM *vm; // 在词法分析的时候可能会需要分配内存空间, 这个时候需要vm来记录分配的内存空间
    } Parser;
    
    • Token, 简而言之就是字符串加上Token的类型
    
    typedef struct Token {
        TokenType type;
        // ptr 与 length 表示一个单词
        char *ptr;
        unsigned int length;
        unsigned int line_no;
    } Token;
    
    • TokenType, 一个包含着Token类型的enum
    
    typedef enum TokenType {
        /*
        符号:
            1. 比较关系符: >, >=, ==, <=, <, !=
            2. 逻辑关系符: &&, ||, !
            3. 位运算符: &, |, ~
            4. 符号: (, [, {, }, ], ), comma(,), dot(.), dotdot(..)
        
        关键字:
            1. while
            2. for
            3. if
            4. else
            5. break
            6. continue
            7. import
            8. class
            9. ...
         其他:
            1. number
            2. string
            3. id
        */
    } TokenType;
    
  • 相关阅读:
    Hadoop集群配置(最全面总结 )(转)
    spring + ibatis 多数据源事务(分布式事务)管理配置方法(转)
    使用java5的注解和Sping/AspectJ的AOP 来实现Memcached的缓存
    2.git使用之git fetch和git push的区别
    1.git使用入门之基本的更新提交操作
    docker命令
    tornado-模版reverse_url
    获得随即图片https://source.unsplash.com/random
    tornado-同步异步下载图片
    html-prepend
  • 原文地址:https://www.cnblogs.com/megachen/p/10106067.html
Copyright © 2020-2023  润新知