词法分析器

词法分析器

函数

  • 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;
posted @   gogogo11  阅读(709)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
点击右上角即可分享
微信分享提示