gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:44:39 26 4
gpt4 key购买 nike

    %%{
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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com