自制编程语言(第三弹)定义Token

终于到了激动人心的实现时候了。为了实现我们的自制语言,我们需要的步骤为:

  1. 词法分析
  2. 语法分析
  3. 语义分析(此处不设置)
  4. 解释器

详细完整的代码可以点击这里查看github项目


词法分析:

将代码片段识别为关键词、标识符、操作符、数字字面量等Token。

首先我们定义需要定义我们语言中所用到所有token类型

public enum TokenType
{
   
    NAME,
    INT_CONST,
    REAL_CONST,
    STR,
    NEWLINE,
    INDENT,
    DEDENT,
    COLON,
    LPAREN,
    RPAREN,
    LBRACK,
    RBRACK,
    ASSIGN,
    COMMENT,
    DOT,
    IF,
    ELSE,
    ELIF,
    CASE,
    WHEN,
    EQ,
    NE,
    LT,
    LE,
    GT,
    GE,
    PLUS,
    MINUS,
    MUL,
    DIV,
    FLOORDIV,
    MOD,
    POW,
    NOT,
    AND,
    OR,
    TRUE,
    FALSE,
    NONE,
    EOF
}

定义一个Token类,用于封装和包含Token信息

public class Token
public TokenType Type {
    get; set; }
public object Value {
    get; set; }
public int Line {
    get; set; }
public int Column {
    get; set; }

对保留字做个映射

public static Dictionary<string, TokenType> ReservedKeywords {
    get; } = new Dictionary<string, TokenType>()
{
   
    {
   "的",TokenType.DOT },
    {
   "如果",TokenType.IF},
    {
   "否则",TokenType.ELSE},
    {
   "否则如果",TokenType.ELIF},
    {
   "选择",TokenType.CASE},
    {
   "选项",TokenType.WHEN},
    {
   "非",TokenType.NOT},
    {
   "并且",TokenType.AND},
    {
   "或者",TokenType.OR},
    {
   "幂",TokenType.POW},
    {
   "true",TokenType.TRUE},
    {
   "false",TokenType.FALSE},
    {
   "none",TokenType.NONE},
    {
   "真",TokenType.TRUE},
    {
   "假",TokenType.FALSE},
    {
   "开",TokenType.TRUE},
    {
   "关",TokenType.FALSE},
    {
   "空",TokenType.NONE},
};
public static Token GetReservedKeywords(string value, int line, int column)
{
   
    if (ReservedKeywords.ContainsKey(value))
        return new Token(ReservedKeywords[value], value, line, column);
    return null;
}

设置构造函数和ToString

public Token(TokenType type, object value, int line, int column)
{
   
    Type = type;
    Value = value;
    Line = line;
    Column = column;
}
public override string ToString()
{
   
    return string.Format("Token({0}, {1}, position = {2}:{3})", Type, Value, Line, Column);
}

相关推荐

  1. 自制编程语言定义Token

    2023-12-05 23:50:06       60 阅读
  2. 自然语言处理阅读

    2023-12-05 23:50:06       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-05 23:50:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-05 23:50:06       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-05 23:50:06       87 阅读
  4. Python语言-面向对象

    2023-12-05 23:50:06       96 阅读

热门阅读

  1. ESP网络开发实例-通过WebSocket控制步进电机

    2023-12-05 23:50:06       58 阅读
  2. C# freesql技术 常用的增删改查sql命令

    2023-12-05 23:50:06       57 阅读
  3. 蓝桥杯ACwing习题

    2023-12-05 23:50:06       46 阅读
  4. 修改git仓库地址

    2023-12-05 23:50:06       54 阅读
  5. Ansible 自动化运维企业实战 (三)

    2023-12-05 23:50:06       68 阅读
  6. 【探秘Python爬虫利器】Beautiful Soup 4库详解

    2023-12-05 23:50:06       50 阅读
  7. webform使用ajax访问后端接口的两种方法

    2023-12-05 23:50:06       56 阅读
  8. React Hooks(实例及详解)

    2023-12-05 23:50:06       39 阅读
  9. ARM MCU SWD离线调试器

    2023-12-05 23:50:06       45 阅读
  10. .sketch的文件转.psd文件

    2023-12-05 23:50:06       55 阅读
  11. 【无标题】

    2023-12-05 23:50:06       69 阅读
  12. 代码解读:Zero-shot 视频生成任务 Text2Video-Zero

    2023-12-05 23:50:06       68 阅读