p4 language learning :Part 1
1.1 Syntax and semantics
P416的完整语法在附录E中给出,使用Yacc / Bison语法描述语言。 该文本基于相同的语法。 提供语法摘录时,我们采用了几种标准约定:
大写符号表示语法中的终端。
语法节选以BNF表示法如下:
p4program
: /* empty */
| p4program declaration
| p4program ';'
;
注:附录E可以在文章末尾所给的链接中找到
伪代码(Pseudo-code)(主要用于描述各种P4构造的语义)以固定大小的字体显示,如以下示例所示:
ParserModel.verify(bool condition, error err) {
if (condition == false) {
ParserModel.parserError = err;
goto reject;
}
}
我们根据执行传统命令式代码的抽象机(abstract machine)来描述P4的语义。 每个P4子语言(解析器,控件)都有一个抽象机。 本文以伪代码和英文描述了抽象机。
P4编译器可以自由重组它们以任何方式生成的代码,只要按照本规范的描述保留了P4程序的外部可见行为,其中外部可见行为定义为:
The input/output behavior of all P4 blocks, and
The state maintained by extern blocks.
1:所有P4块的输入/输出行为
2: 由外部块保持的状态
1.2 Preprocessing
为了帮助从多个源文件组成程序,P4编译器应支持C预处理程序功能的以下子集:
#define //for defining macros (without arguments)
#undef
#if #else #endif #ifdef #ifndef #elif
#include
预处理程序还应删除序列反斜杠换行符(ASCII码92、10),以便在格式化时方便地将内容拆分为多行。
可能会支持其他C预处理器功能,但不能保证,例如带有参数的宏。与C类似,#include可以在双引号或<>中指定文件名
# include <system_file>
# include "user_file"
两种形式之间的区别在于,当路径未完全指定时,预处理器搜索头文件的顺序
P4编译器应正确处理可能在预处理期间生成的#line指令。
此功能允许从多个源文件构建P4程序,这些文件可能由不同的程序员在不同的时间生成:
1:本文档中定义的P4核心库(the P4 core library)
2:建筑(architecture),定义数据平面接口和外部模块
3:用户定义的有用组件库( (user-defined libraries of useful components )(例如,标准协议标头定义)
4:P4程序,用于指定每个可编程块的行为。
注:
#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符命令的基本形式如下:
#line number[“filename”]
其中[ ]内的文件名可以省略。例如:
#line 30 a.h
其中,文件名a.h 可以省略不写。
这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C 源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。
注释来源网址:C语言中文网
1.2.1 P4 core library
P4语言规范定义了一个核心库(core library),其中包括几个常见的编程构造。 附录B中提供了核心库的描述。所有P4程序都必须包括核心库。 包括核心库是用:
# include <core.p4>
1.3 Lexical constructs
所有P4关键字仅使用ASCII字符。 所有P4标识符只能使用ASCII字符。 P4编译器应正确处理注释和字符串文字中包含8位字符的字符串。 P4区分大小写。 空格字符(包括换行符)被视为标记分隔符。 缩进是自由形式; 但是,P4具有类似C的块结构,并且我们所有的示例都使用C样式的缩进。 制表符被视为空格。
IDENTIFIER(标识符):以字母或下划线开头,并包含字母,数字和下划线
TYPE(类型):表示类型名称的标识符
INTEGER(整数):整数文字
DONTCARE:下划线
诸如RETURN之类的关键字。 按照惯例,每个关键字终端对应于具有相同拼写但使用小写字母的语言关键字。 例如,RETURN终端对应于return关键字。
1.3.1 Identifiers
标识符:不赘述,和C基本一致。
1.3.2 Comments
注释:不赘述,和C++基本一致。
1.3.3 Literal constants
1.3.3.1 Boolean literals
布尔类型:ture 和 false两种
1.3.3.2 Integer literals
整型类型:都为正数且为任意精度
默认为10进制可以使用前缀改变进制:
0x or 0X indicates base 16 (hexadecimal)
0o or 0O indicates base 8 (octal)
0b or 0B indicates base 2indicate
数字文字的宽度(以位为单位)可以由一个无符号数字前缀指定,该前缀由多个位数和一个符号指示符组成:
w indicates unsigned numbers
s indicates signed numbers
直接上例子:
32w0xFF // a 32-bit unsigned number with value 255
32s0xFF // a 32-bit signed number with value 255
8w0b10101010 // an 8-bit unsigned number with value 0xAA
8w0b_1010_1010 // same value as above
8w170 // same value as above
8s0b1010_1010 // an 8-bit signed number with value -86
16w0377 // 16-bit unsigned number with value 377 (not 255!)
16w0o377 // 16-bit unsigned number with value 255 (base 8)
这个部分还是比较简单的,好好掌握!
笔者注:
1.做这个学习笔记的目的是自己在刚刚开始学习这个部分时,在哪里都找不到学习的资料,而找到的资料是纯英语版的,学习难度较大,希望做这个系列可以坚持下来,一方面帮助想学p4的同学尽快入门,另一方面督促自己学习。
2.这个学习笔记几乎都来源于P416 Language Specification,大家可以进入超链接查看原文,借用google翻译了大部分,有些名词怕翻译不准,显示了原词,若有错误欢迎指正。
3.今天先学到这,剩下的明天继续(希望有时间~),这里主要学语法,后期尽量写一下实验操作和实验遇到的问题,语法的前面部分的有所省略,大家可以结合翻译软件好好读一下代码,我觉得会对理解数据包的处理过程理解有帮助!
4.最后如果有大神对p4的学习有建议,十分欢迎评论留言,我现在对它的学习还是很茫然,期待得到大家的帮助。
287



被折叠的 条评论
为什么被折叠?



