5 语言元素

5.1 标识符

标识符用于命名变量和函数。它是一个字母和数字组成的串,可以包含下划线(_) 和美元符号($) 。除了美元符号作为合法字符外,它和C 标识符的语法一样。以美元符号开头的标识符解释为目标软件变量的引用,而不是SystemTap 脚本变量。标识符不能以数字开始。

5.2 数据类型

SystemTap 语言仅有数种数据类型,均不需要类型声明。变量的类型可从它的使用环境中推导出来。为了支持类型推导,转换器强制要求函数的参数和返回值,数组下标和值在使用时要保证类型一致。字符串和整数之间不存在隐式类型转换。标识符在使用时,类型不一致的相关使用都会产生一个错误信号。

5.2.1 字面值

字面值有两种,分别是字符串和整数。字面值可以是十进制,八进制或十六进制,遵照C 语言的标记法,不需要指定类型后缀(如L或U )。

5.2.2 整数

整数可以是十进制, 十六进制, 或者八进制, 和C 语言标记法相同。整数是一个64 位有符号变量,尽管分析器可以接受(同时会回 卷)大于2^63 且小于2^64 的整数(译者注:一个64 位有符号整型可以储存的整数范围是[-2^63,2^63 ),因此大于2^63 且小于2^64的整数会回 卷成相应的负数 )。

5.2.3 字符串

字符串被括在引号(”” )内,反斜杠转义码均按标准C 的转义字符进行解释。字符的长度不能超过MAXSTRINGLEN ,关于字符串长度或其它限制,请参阅1.6 节。

5.2.4 关联数组

请参阅7 节。

5.2.5 统计变量

请参阅8 节。

5.3 分号

分号是一个条空语句,即什么事情也不做。分号是可选的,用作语句的分隔符,通常有助于检查语法错误和消除语法的二义性。

5.4 注释

SystemTap 脚本支持下述三种注释:

# ... shell style, to the end of line

// ... C++ style, to the end of line

/* ... C style ... */

5.5 空白符

正如C 一样,空格,制表符,回车,换行和注释均被视为空白,分析器直接忽略。

5.6 表达式

SystemTap 提供大量的运算符,并且它的用法,语义和优先级均与C 和awk 相同。算术运算符按C 语言中的有符号整数运算规则执行。如果分析器检测到除数为0 或发生溢出,将产生一个错误。这些运算符(分类)罗列在下述各子章节。

5.6.1 二元数值运算符

* / % + - >> << & ^ | && ||

5.6.2 二元字符串运算符

. ( 字符串串接)

5.6.3 数值赋值运算符

= *= /= %= += -= >>= <<= &= ^= |=

5.6.4 字符串赋值运算符

= .=

5.6.5 一元数值运算符

+ - ! ~ ++ -

5.6.6 二元数值/ 字符串比较运行算

< > <= >= == !=

5.6.7 三元运算符

cond ? exp1 : exp2

5.6.8 组合运算符

( exp )

5.6.9 函数调用

函数调用的语法形式如下:

fn ([ arg1, arg2, ... ])

5.6.10 $ptr->member

Ptr 是探测下文中的变量,一个内核指针。

5.6.11 <value> in <array_name>

如果数组包含指定下标的元素,那么上述表达式求值结果为真。

5.6.12 [ <value>, ... ] in <array_name>

下标的个数必须与数组定义时指定的下标个数一致。

5.7 stap 命令行传递过来的字面值

字符值要么是由引号包含的字符串,要么是整数。关于整数的信息,请参阅5.2.2 节,而字符串的信息,请参阅5.2.3 节。

命令行后面的脚本参数被扩展为字面值,可将它用于所有接受字面值的上下文中,但引用不存在的参数编号将引致错误。

5.7.1 $1 ... $<NN> 将参数转换成整数

使用$1 ... $<NN> 将命令行参数转换成整数字面值。

5.7.2 @1 ... @<NN> 将参数转换成字符串

使用@1 ... @<NN> 将命令行参数转换成字符串字面值。

5.7.3 例子

以下述为例,假定该脚本的名字为example.stp

probe begin { printf("%d, %s/n", $1, @2) }

运行如下:

# stap example.stp 10 mystring

那么,$1 会被替换成10 ,而@2 会被替换成"mystring" ,结果输出:

10, mystring

5.8 条件编译

5.8.1 条件

词法分析工作包含简单的条件预处理阶段,它的语法形式类似于三元运算符(5.6.7 节),如下:

%( CONDITION %? TRUE-TOKENS %)

%( CONDITION %? TRUE-TOKENS %: FALSE-TOKENS %)

CONDITION 是一个有限表达式(limited expression ),它的语法格式由它的第一个关键字决定,下述是它的一般语法格式:

%( <condition> %? <code> [ %: <code> ] %)

5.8.2 基于内核版本号的条件: kernel_v 和kernel_vr

此种条件表达式的第一部分是标识符kernel_v 或kernel_vr ,第二部分是六个标准数值比较运算符``<'', ``<='', ``=='', ``!='', ``>'', or ``>='' 之一,第三部分字符串字面值,一个RPM 形式的版本- 发布号值。如果目标内核的版本(可使用-r 选项来重写该版本号)与给定的版本字符串匹配,那么该条件返回真,其中比较操作是由glibc 的strverscmp 函数来实行的。

kernel_v 仅引用内核版本号数值,如"2.6.13" 。

而kernel_vr 除于引用内核版本号数值外,还包含发布号后缀,如 “2.6.13-1.322FC3smp” 。

5.8.3 基于架构的条件:arch

这种条件表达式的第一部分是标识符arch ,它引用处理器架构类型,第二部分是字符串比较运算符”==” 或”!=” ,第三部分字符串字面值。比较结果是简单的字符串相等和不相等。目前所支持的架构字符串分别有:i386 ,i686 ,x86_64 ,ia64 ,s390 和ppc64。

5.8.4 TRUN-TOKENS 和FALSE-TOKENS

TRUE-TOKENS 和FALSE-TOKENS 是零个或多个语法单元(parser tokens ),可以包含嵌套的预处理条件。如果条件为真,则传递TRUE-TOKENS 到分析器的输入流,否则传递TRUE-TOKENS 。例如,下述例子中除非目标内核版本新于2.6.5 ,否则产生一个语法分析错误。

%( kernel_v <= "2.6.5" %? **ERROR** %) # invalid token sequence

下述代码可适合在不同的内核版本上运行。

probe kernel.function (

%( kernel_v <= "2.6.12" %? "__mm_do_fault" %:

%( kernel_vr == "2.6.13-1.8273FC3smp" %? "do_page_fault" %: UNSUPPORTED %)

%)) { /* ... */ }

%( arch == "ia64" %?

probe syscall.vliw = kernel.function("vliw_widget") {}

%)

下述代码适用于打开内核CONFIG_UTRACR 选( 译者注:原文是CONFIG ,估计是笔误) 。

%( CONFIG_UTRACE == "y" %?

probe process.syscall {}

%)

《System语言详解》——5. 语言元素相关推荐

  1. 武林c语言,详解C语言中条件编译

    预处理器提供条件编译,程序的不同部分可以在不同的条件下编译,从而产生不同的目标代码文件,这对于程序移植和调试非常有用,本文是武林技术频道小编给为大家带来的详解中条件编译,一起来了解一下吧! 通常情况, ...

  2. 结构体自定义指针函数c语言,详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式, ...

  3. 24c02读程序C语言详解,C语言编写的 24C02程序

    #define uchar unsigned char #define uint unsigned int #include reg52.h> #include stdio.h> #inc ...

  4. 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

  5. 有向图邻接矩阵c语言编程,邻接矩阵有向图(一)之 C语言详解

    本章介绍邻接矩阵有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...

  6. 邻接矩阵用c语言,邻接矩阵无向图(一)之 C语言详解

    本章介绍邻接矩阵无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实 ...

  7. Drools 规则语言详解(上)

    http://www.blogjava.net/guangnian0412/archive/2006/06/09/51574.html http://www.blogjava.net/guangnia ...

  8. DBus glib 各数据类型接收与发送详解—C语言(3)

    DBus glib 各数据类型接收与发送详解-C语言(3) 动机 前置知识 正文 Python 测试服务 使用 C 实现复杂数据类型的传递 DICT_DICT ObjectPath_Dict_Stru ...

  9. 详解go语言的array和slice 【二】

    上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲 ...

  10. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

最新文章

  1. 一段关于低价的对话(被低价困扰的安利伙伴进!)
  2. 我该建数仓、大数据平台还是数据中台?看完脑子终于清醒了
  3. MySQL获取Schema表名和字段信息
  4. boost::dynamic_bitset模块的测试程序
  5. 笔记:数据绑定表达式(一)
  6. 让VS2013支持 C# 6.0 语法
  7. 二级VB培训笔记11:培训答疑集
  8. iis php.exe,在IIS75下使用php运行exe程序的总结
  9. R语言数据挖掘1.9.1 机器学习方法
  10. Javascript心得(一) Javascript数据类型
  11. php留言板入门教程,一个php留言板实例
  12. 用Nginx禁止指定IP、国外IP访问我的网站
  13. SSD---系统架构
  14. Python爬取淘宝商品附加cookie修改
  15. 访问控制和网络冗余--ACL+NAT
  16. char字符变量在c语言中有什么用,c语言char怎么用
  17. java selector wakeup_java – 如何检测Selector.wakeup调用
  18. element-ui中table 去掉表头、去掉边框线、去掉鼠标悬停背景颜色
  19. 服务器不能使用无线键盘,台式机无线键盘不能使用解决方法
  20. android文件恢复,安卓手机文件丢失了,如何恢复?

热门文章

  1. 佳能G系列领军相机G1X
  2. js实现php中图片轮播,两种js实现轮播图的方式
  3. 【新发现】不用苹果开发账号就能申请ios证书真机调试
  4. git rebase之前需要 commit 才行
  5. SAS 146GB*8 RAID5数据恢复过程(HP 双循环)
  6. 《Android和PHP开发最佳实践》一第3章 PHP开发准备
  7. 谈谈python的from __future__ import absolute_import
  8. 在eclipse中创建web项目
  9. 大数据实验数据集何处来?
  10. windows终止处理程序( __try __finally) 简单解析