%%{
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
指针
p
在RecordDigit
是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/