%%{ 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动作,如果是这样,currentNumber初始化为零,将它乘以10会有什么用.
最后,数字的定义. number =((数字@RecordDigit))> ClearNumber是什么意思?
这是代码的来源:here
编辑:
*具体来说RecordDigit如何工作?什么是p?一个指针?如果是这样,它指向什么?什么是digit =(* p) – ‘0’;意思? [解决了]
RecordDigit中的p是Ragel所需的变量.它是一个“指向要处理的字符数据的指针.”(在Java和Ruby中,它是字节数组的偏移量,数据).表达式(* p) – ‘0’因此取当前字符的字符代码(例如’7’的代码在ASCII中为55),减去字符代码’0′(ASCII中的48)以获得由字符表示的实际数值:55 – 48 = 7.
>和@ *** 作符
>运算符用于在从启动状态进入机器时执行 *** 作. @运算符用于在将机器移动到最终状态时执行 *** 作.
这意味着:
((digit @RecordDigit)+) >ClearNumber
在输入时首先调用ClearNumber,并在每次匹配数字时调用RecordDigit.通过更改 *** 作可以轻松验证这一点,如下所示:
action ClearNumber { printf("ClearNumber\n"); currentNumber = 0; } action RecordDigit { printf("RecordDigit\n"); uint8_t digit = (*p) - '0'; currentNumber = (currentNumber * 10) + digit; }
打印出来:
ClearNumberRecordDigitRecordDigitRecordDigit
一个3位数字.
摘要
当第一次遇到新数字时,currentNumber设置为0.数字由(* p) – ‘0’变为uint8_t,并存储到currentNumber中.当下一个数字到来时,计算其数值,并将其添加到currentNumber的当前值乘以10等.因此,此Ragel示例的目的是将字符串中以空格分隔的数字转换为整数.
参考
Ragel user guide包含上述元素的所有信息,非常容易阅读.我自己是Ragel的初学者,编写我自己的样本没有问题.
总结以上是内存溢出为你收集整理的这部Ragel代码有什么作用?全部内容,希望文章能够帮你解决这部Ragel代码有什么作用?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)