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