这部Ragel代码有什么作用?
%%{ 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 编辑: 解决方法
p指针
RecordDigit中的p是Ragel所需的变量.它是一个“指向要处理的字符数据的指针.”(在Java和Ruby中,它是字节数组的偏移量,数据).表达式(* p) – ‘0’因此取当前字符的字符代码(例如’7’的代码在ASCII中为55),减去字符代码’0′(ASCII中的48)以获得由字符表示的实际数值:55 – 48 = 7. >和@操作符 >运算符用于在从启动状态进入机器时执行操作. @运算符用于在将机器移动到最终状态时执行操作. 这意味着: ((digit @RecordDigit)+) >ClearNumber 在输入时首先调用ClearNumber,并在每次匹配数字时调用RecordDigit.通过更改操作可以轻松验证这一点,如下所示: action ClearNumber { printf("ClearNumbern"); currentNumber = 0; } action RecordDigit { printf("RecordDigitn"); 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 user guide包含上述元素的所有信息,非常容易阅读.我自己是Ragel的初学者,编写我自己的样本没有问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |