C语言类型声明的文法
2013-12-19 02:00
155 查看
尝试过3种思路,最后才写出一个满意的推导式。
支持带id和省略id的写法。
如:
long int * ( * id ) ()
也支持省略id,即 long int * ( * ) () ,这也会被视为一个合乎语法的串,从语义上再根据上下文来决定缺省id是否合乎语义就可以了。
先将 c 的类型声明先分为2个部分,前置类型段和符号声明段。再将符号声明段分为3个部分。
接上例:
前置类型段为: long int
符号声明段,其中:
前段: *
中段: (*id)
后段: ()
前置类型段推导式为:
TDcl = SU
| Enum
| Types
| const TDcl
| TDcl const
SU是指以struct union关键字开始的文法, Enum是enum关键字开始的文法,const是终结符,指const或volatile
这样,TDcl就会将直到 * ( [ id 前的符号归结。
如 int const , struct XXX { int a; } const volatile
符号声名段的文法如下:
NDcl = NDclPr
| NDclPr NDclMd
| NDclPr NDclMd NDclBk
符号声明段可以是: 只有前段 或 前段+中段 或 三段都有。
这三种情况分别对应: int const | int const * | int const *id [10]
三段的文法为:
NDclPr = mul
| NDclPr mul
| NDclPr const
NDclMd = id
| bl NDcl br
NDclBkI= kl kr
| kl Expr kr
| bl br
| bl FPS br
NDclBk = NDclBkI
| NDclBk NDclBkI
其中,mul就是指*号, FPS是形式参数的文法:
FPSI = TDcl
| TDcl NDcl
FPS = FPSI
| FPS comma FPSI
| FPS comma dot3
(comma 是 符号 , (逗号) , dot3 是 ... (不定长参数) )
支持带id和省略id的写法。
如:
long int * ( * id ) ()
也支持省略id,即 long int * ( * ) () ,这也会被视为一个合乎语法的串,从语义上再根据上下文来决定缺省id是否合乎语义就可以了。
先将 c 的类型声明先分为2个部分,前置类型段和符号声明段。再将符号声明段分为3个部分。
接上例:
前置类型段为: long int
符号声明段,其中:
前段: *
中段: (*id)
后段: ()
前置类型段推导式为:
TDcl = SU
| Enum
| Types
| const TDcl
| TDcl const
SU是指以struct union关键字开始的文法, Enum是enum关键字开始的文法,const是终结符,指const或volatile
这样,TDcl就会将直到 * ( [ id 前的符号归结。
如 int const , struct XXX { int a; } const volatile
符号声名段的文法如下:
NDcl = NDclPr
| NDclPr NDclMd
| NDclPr NDclMd NDclBk
符号声明段可以是: 只有前段 或 前段+中段 或 三段都有。
这三种情况分别对应: int const | int const * | int const *id [10]
三段的文法为:
NDclPr = mul
| NDclPr mul
| NDclPr const
NDclMd = id
| bl NDcl br
NDclBkI= kl kr
| kl Expr kr
| bl br
| bl FPS br
NDclBk = NDclBkI
| NDclBk NDclBkI
其中,mul就是指*号, FPS是形式参数的文法:
FPSI = TDcl
| TDcl NDcl
FPS = FPSI
| FPS comma FPSI
| FPS comma dot3
(comma 是 符号 , (逗号) , dot3 是 ... (不定长参数) )
相关文章推荐
- 第一部分 基本语言 第二章 变量和基本类型(2.3.5声明和定义)
- C++程序设计语言--第四章:类型和声明
- 【FLA学习笔记】1:符号和符号串,文法和语言,文法的类型
- 《C专家编程》:语言类型的声明(三)
- Go语言学习笔记 --- 常量、变量、批量定义与声明、数据类型、类型别名、类型转换
- 生成跨语言的类型声明和接口绑定的工具(Djinni )
- 【Go】为什么 Go 语言把类型声明放在后面?
- 汇编语言数据类型与声明
- C程序设计语言- 类型、运算符与表达式-2.1----变量名、数据类型及长度、常量、声明、算数运算符、关系运算符与逻辑预算符
- 菜鸡的swift学习(1):Mac中语言设定,no such module Cocoa的,可选类型的声明
- Objective-C 声明一个C语言类型的数组和访问方式@property
- 第一部分 基本语言 第三章 标准库类型(命名空间的using声明)
- 基本语言细节--《The C++ Programming Language 》--(2)类型和声明
- Go语言类型声明以及转换、默认值
- 深度剖析C和C++的复杂类型声明
- 兴奋、强类型版的PHP语言 - Hack
- 强类型语言JAVA与弱类型语言JS的小小认识
- C语言文件操作类型速查
- C/C++语言的存储类型
- C#语言基础— 数据类型及其转换