加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

这部Ragel代码有什么作用?

发布时间:2020-12-16 09:32:45 所属栏目:百科 来源:网络整理
导读:%%{ machine microscript; action ClearNumber { currentNumber = 0; } action RecordDigit { uint8_t digit = (*p) - '0'; currentNumber = (currentNumber * 10) + digit; } number = ((digit @RecordDigit)+) ClearNumber; whitespace = space+; main :=
%%{
  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("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的初学者,编写我自己的样本没有问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读