这段Ragel Code是做什么的?

%%{ 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)*; }%% 

编辑:让我明白这个“>”运算符的含义。 我从ragel指南中引用了对jjjugu的评论

我明白ClearNumber操作是在RecordDigit之前调用的,如果是这样,currentNumber被初始化为零,那么乘以10的用法是什么。

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

这是代码的来源: 这里

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

p指针

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

>@运营商

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

这意味着:

 ((digit @RecordDigit)+) >ClearNumber 

输入时首先调用ClearNumber ,每次digit匹配时调用RecordDigit 。 这可以通过如下更改操作来轻松验证:

  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.该数字被(*p) – '0'改变为uint8_t ,并被存储到currentNumber 。 当下一个数字到来时,它的数值被计算出来,并加到currentNumber的当前值乘以10等等。所以这个Ragel样本的目的是把一个字符串中空格分隔的数字转换成整数。

参考

Ragel用户指南包含了上述元素的所有信息,并且非常容易阅读。 我自己是Ragel的初学者,写我自己的样本没有问题。

我不知道ragel,但是RecordDigit的代码和C很相似,所以就是它的功能。 如你所怀疑的,p是一个指针; * p查看字符数组(字符串)的字符。 从字符“9”中减去“0”会留下数值9.如你所注意到的,乘以10是没有意义的第一次被调用,但随着连续的数字被翻译,这是非常有道理的,因为现在的数字'321'变成321,在每次调用RecordDigit后乘以10,将数字移过小数点。

我还没有想到“号码”。

虽然我不知道ragel 。但看看代码,它似乎将一个字符串转换成一个数字 。如果你记得数字0-9的范围从48到57的ASCII值。所以假设输入字符串是'123',所以你正在获取第一个字符,并减去它48,以获得它的值是1.然后再乘以10十进制数字123。

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

'数字'是一个内置的机器:[0-9]

它会逐个收集数字(使用“+”运算符,意为“1..N”),并在新数字开始时输入ClearNumber操作。

@RecordDigit动作用于在解析期间计算数字。

对不起,我的英文,而不是我的母语。 希望这可以帮助。

要真正了解ragel,你必须生成图表。 安装graphviz并像这样运行ragel:

 ragel -V -p microscript.rl | dot -Tpng -o microscript.png 

通常我只是使用Makefile

 %.png: %.rl ragel -V -p $*.rl | dot -Tpng -o $@ 

所以我可以运行make microscript.png

在这里输入图像描述