c - 这段 Ragel 代码有什么作用?

标签 c linux ragel

    %%{
  machine microscript;

  action ClearNumber {
    currentNumber = 0;
  }

  action RecordDigit {
    uint8_t digit = (*p) - '0';
    currentNumber = (currentNumber * 10) + digit;
  }

  number = ((digit @RecordDigit)+) >ClearNumber;
  whitespace = space+;

  main := number (whitespace number)*;
}%% 

编辑: 让我理解这个“>”运算符的含义。我在@jcomeu 的评论中引用了 ragel 指南中的描述

我理解在RecordDigit之前调用了ClearNumber Action ,如果是这样,currentNumber被初始化为零,乘以10有什么用。

最后,数字的定义。 number=((digit @RecordDigit)+) >ClearNumber 是什么意思?

这是源代码:here

编辑: *具体RecordDigit是如何工作的? p 是什么?指针?如果是这样,它指向什么? digit =(*p)- '0'; 是什么意思? [已解决]

最佳答案

p指针

pRecordDigit是Ragel需要的变量。它是“指向要处理的字符数据”的指针。 (在 Java 和 Ruby 中,它是字节数组的偏移量,data)。表达式 (*p) - '0'因此取当前字符的字符编码(例如'7'的ASCII编码为55),减去'0'的字符编码(ASCII 中的 48) 得到字符表示的实际数值:55 - 48 = 7 .

>@运营商

>运算符用于从启动状态进入机器时执行 Action 。 @运算符用于在将机器移动到最终状态时执行操作。

这意味着:

((digit @RecordDigit)+) >ClearNumber

先打电话ClearNumber进入并调用RecordDigit每次digit匹配。这可以通过如下更改操作轻松验证:

  action ClearNumber {
    printf("ClearNumber\n");
    currentNumber = 0;
  }

  action RecordDigit {
    printf("RecordDigit\n");
    uint8_t digit = (*p) - '0';
    currentNumber = (currentNumber * 10) + digit;
  }

打印出来:

ClearNumber
RecordDigit
RecordDigit
RecordDigit

对于 3 位数字。

总结

第一次遇到新数字时,currentNumber设置为 0。数字变为 uint8_t通过 (*p) - '0',并存入 currentNumber .当下一位出现时,计算其数值,并将其添加到 currentNumber 的当前值中。乘以 10,等等。所以这个 Ragel 示例的目的是将字符串中以空格分隔的数字转换为整数。

引用

Ragel user guide包含有关上述元素的所有信息,并且非常易于阅读。我自己是 Ragel 的初学者,编写自己的示例没有问题。

关于c - 这段 Ragel 代码有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012330/

相关文章:

java - Ragel - 输入时验证字符串

c - C上两个不同整数的用法

java - 用于 Java/Android 的 echoprint 代码生成器

c - 负数 : How can I change the sign bit in a signed int to a 0?

c++ - Ubuntu 10.04,将 MAP_HUGETLB 与 MAP_SHARED 一起使用时出错

go - Ragel 转换 Action 和状态 Action 之间的区别

c++ - 在 C++ 代码库中使用 Ragel 解析字符串的原因是什么?

c - 使用指针和数组调试程序

linux - 如何获取上个月创建的所有文件的行数?

node.js - 设置终端命令以在 Crontab 中运行