这部Ragel代码有什么作用?

这部Ragel代码有什么作用?,第1张

概述%%{ machine microscript; action ClearNumber { currentNumber = 0; } action RecordDigit { uint8_t digit = (*p) - '0'; currentNumber = (currentNumber * 10) + digit; } number =
%%{  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’;意思? [解决了]

解决方法 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("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代码有什么作用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存