VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: VBProFan

ANSI C 的 Lex 和 Yacc

[复制链接]
 楼主| 发表于 2010-8-29 10:22:57 | 显示全部楼层
本帖最后由 VBProFan 于 2010-8-29 10:25 编辑

翻译、整理了一下,哇哈哈,C 语言程序就是由这68条产生式运算得到的:

1★开始符号  →
      外部声明
    | 开始符号 外部声明

2★外部声明  →
      函数定义
    | 声明
   
3★函数定义  →
      声明标识符 声明符 声明列表 复合语句
    | 声明标识符 声明符 复合语句
   
4★声明标识符  →
      存储类型标识符
    | 存储类型标识符 声明标识符
    | 类型标识符
    | 类型标识符 声明标识符
    | 类型限定符
    | 类型限定符 声明标识符
    | 函数说明符
    | 函数说明符 声明标识符
   
5★声明  →
      声明标识符 ';'
    | 声明标识符 初始化声明符列表 ';'
   
6★声明列表  →
      声明
    | 声明列表 声明
   
   
7★声明符  →
      指针 直接声明符
    | 直接声明符
   

8★直接声明符  →
      IDENTIFIER
    | '(' 声明符 ')'
    | 直接声明符 '[' 类型限定符列表 赋值表达式 ']'
    | 直接声明符 '[' 类型限定符列表 ']'
    | 直接声明符 '[' 赋值表达式 ']'
    | 直接声明符 '[' STATIC 类型限定符列表 赋值表达式 ']'
    | 直接声明符 '[' 类型限定符列表 STATIC 赋值表达式 ']'
    | 直接声明符 '[' 类型限定符列表 '*' ']'
    | 直接声明符 '[' '*' ']'
    | 直接声明符 '[' ']'
    | 直接声明符 '(' 参数类型列表 ')'
    | 直接声明符 '(' 标识符列表 ')'
    | 直接声明符 '(' ')'
   
9★类型限定符列表  →
      类型限定符
    | 类型限定符列表 类型限定符
   

10★限定符列表  →
      类型标识符 限定符列表
    | 类型标识符
    | 类型限定符 限定符列表
    | 类型限定符
   
11★存储类型标识符  →
      TYPEDEF
    | EXTERN
    | STATIC
    | AUTO
    | REGISTER
   
12★类型标识符  →
      VOID
    | CHAR
    | SHORT
    | INT
    | LONG
    | FLOAT
    | DOUBLE
    | SIGNED
    | UNSIGNED
    | BOOL
    | COMPLEX
    | IMAGINARY
    | 结构联合标识符
    | 枚举符
    | 类型名
   
13★主表达式  →
      IDENTIFIER
    | CONSTANT
    | STRING_LITERAL
    | '(' 表达式 ')'
   
14★后缀表达式  →
      主表达式
    | 后缀表达式 '[' 表达式 ']'
    | 后缀表达式 '(' ')'
    | 后缀表达式 '(' 逗号表达式 ')'
    | 后缀表达式 '.' IDENTIFIER
    | 后缀表达式 PTR_OP IDENTIFIER
    | 后缀表达式 INC_OP
    | 后缀表达式 DEC_OP
    | '(' 类型名 ')' '{' 初始化符列表 '}'
    | '(' 类型名 ')' '{' 初始化符列表 ',' '}'
   
15★逗号表达式  →
      赋值表达式
    | 逗号表达式 ',' 赋值表达式
   
16★单目表达式  →
      后缀表达式
    | INC_OP 单目表达式
    | DEC_OP 单目表达式
    | 单目运算符 强制类型转换表达式
    | SIZEOF 单目表达式
    | SIZEOF '(' 类型名 ')'
   
17★单目运算符  →
      '&'
    | '*'
    | '+'
    | '-'
    | '~'
    | '!'
   
18★强制类型转换表达式  →
      单目表达式
    | '(' 类型名 ')' 强制类型转换表达式
   
19★乘除表达式  →
      强制类型转换表达式
    | 乘除表达式 '*' 强制类型转换表达式
    | 乘除表达式 '/' 强制类型转换表达式
    | 乘除表达式 '%' 强制类型转换表达式
   
20★加减法表达式  →
      乘除表达式
    | 加减法表达式 '+' 乘除表达式
    | 加减法表达式 '-' 乘除表达式
   
21★移位表达式  →
      加减法表达式
    | 移位表达式 LEFT_OP 加减法表达式
    | 移位表达式 RIGHT_OP 加减法表达式
   
22★关系式表达式  →
      移位表达式
    | 关系式表达式 '<' 移位表达式
    | 关系式表达式 '>' 移位表达式
    | 关系式表达式 LE_OP 移位表达式
    | 关系式表达式 GE_OP 移位表达式
   
23★大小比较表达式  →
      关系式表达式
    | 大小比较表达式 EQ_OP 关系式表达式
    | 大小比较表达式 NE_OP 关系式表达式
   
24★按位与表达式  →
      大小比较表达式
    | 按位与表达式 '&' 大小比较表达式
   
25★按位异或表达式  →
      按位与表达式
    | 按位异或表达式 '^' 按位与表达式
   
26★按位或表达式  →
      按位异或表达式
    | 按位或表达式 '|' 按位异或表达式
   
27★逻辑与表达式  →
      按位或表达式
    | 逻辑与表达式 AND_OP 按位或表达式
   
28★逻辑或表达式  →
      按位与表达式
    | 逻辑或表达式 OR_OP 按位与表达式
   
29★条件表达式  →
      逻辑或表达式
    | 逻辑或表达式 '?' 表达式 ':' 条件表达式
   
30★赋值表达式  →
      条件表达式
    | 单目表达式 赋值操作符 赋值表达式
   
31★赋值操作符  →
      '='
    | MUL_ASSIGN
    | DIV_ASSIGN
    | MOD_ASSIGN
    | ADD_ASSIGN
    | SUB_ASSIGN
    | LEFT_ASSIGN
    | RIGHT_ASSIGN
    | AND_ASSIGN
    | XOR_ASSIGN
    | OR_ASSIGN
   
32★表达式  →
      赋值表达式
    | 表达式 ',' 赋值表达式
   
33★常量表达式  →
      条件表达式

34★初始化声明符列表  →
      初始化声明符
    | 初始化声明符列表 ',' 初始化声明符
   
35★初始化声明符  →
      声明符
    | 声明符 '=' 初始化符
   
36★结构联合标识符  →
      结构联合 IDENTIFIER '{' 结构定义列表 '}'
    | 结构联合 '{' 结构定义列表 '}'
    | 结构联合 IDENTIFIER
   
37★结构联合  →
      STRUCT
    | UNION
   
38★结构定义列表  →
      结构声明
    | 结构定义列表 结构声明
   
39★结构声明  →
      限定符列表 结构声明符列表 ';'
   
40★结构声明符列表  →
      结构声明符
    | 结构声明符列表 ',' 结构声明符
   
41★结构声明符  →
      声明符
    | ':' 常量表达式
    | 声明符 ':' 常量表达式
   
42★枚举符  →
      ENUM '{' 枚举列表 '}'
    | ENUM IDENTIFIER '{' 枚举列表 '}'
    | ENUM '{' 枚举列表 ',' '}'
    | ENUM IDENTIFIER '{' 枚举列表 ',' '}'
    | ENUM IDENTIFIER
   
43★枚举列表  →
      枚举
    | 枚举列表 ',' 枚举
   
44★枚举  →
      IDENTIFIER
    | IDENTIFIER '=' 常量表达式
   
45★类型限定符  →
      CONST
    | RESTRICT
    | VOLATILE
   
46★函数说明符  →
      INLINE
   
47★指针  →
      '*'
    | '*' 类型限定符列表
    | '*' 指针
    | '*' 类型限定符列表 指针
   
48★参数类型列表  →
      参数列表
    | 参数列表 ',' ELLIPSIS
   
49★参数列表  →
      参数声明
    | 参数列表 ',' 参数声明
   
50★参数声明  →
      声明标识符 声明符
    | 声明标识符 抽象声明符
    | 声明标识符
   
51★标识符列表  →
      IDENTIFIER
    | 标识符列表 ',' IDENTIFIER
   
52★类型名  →
      限定符列表
    | 限定符列表 抽象声明符
   
53★抽象声明符  →
      指针
    | 直接抽象声明符
    | 指针 直接抽象声明符
   
54★直接抽象声明符  →
      '(' 抽象声明符 ')'
    | '[' ']'
    | '[' 赋值表达式 ']'
    | 直接抽象声明符 '[' ']'
    | 直接抽象声明符 '[' 赋值表达式 ']'
    | '[' '*' ']'
    | 直接抽象声明符 '[' '*' ']'
    | '(' ')'
    | '(' 参数类型列表 ')'
    | 直接抽象声明符 '(' ')'
    | 直接抽象声明符 '(' 参数类型列表 ')'
   
55★初始化符  →
      赋值表达式
    | '{' 初始化符列表 '}'
    | '{' 初始化符列表 ',' '}'
   
56★初始化符列表  →
      初始化符
    | 指示 初始化符
    | 初始化符列表 ',' 初始化符
    | 初始化符列表 ',' 指示 初始化符
   
57★指示  →
      指示符列表 '='
   
58★指示符列表  →
      指示符
    | 指示符列表 指示符
   
59★指示符  →
      '[' 常量表达式 ']'
    | '.' IDENTIFIER
   
60★语句  →
      标号语句
    | 复合语句
    | 表达式语句
    | 分支语句
    | 循环语句
    | 跳转语句
   
61★标号语句  →
      IDENTIFIER ':' 语句
    | CASE 常量表达式 ':' 语句
    | DEFAULT ':' 语句
   
62★复合语句  →
      '{' '}'
    | '{' 语句块序列 '}'
   
63★语句块序列  →
      语句块项目
    | 语句块序列 语句块项目
   
64★语句块项目  →
      声明
    | 语句
   
65★表达式语句  →
      ';'
    | 表达式 ';'
   
66★分支语句  →
      IF '(' 表达式 ')' 语句
    | IF '(' 表达式 ')' 语句 ELSE 语句
    | SWITCH '(' 表达式 ')' 语句
   
67★循环语句  →
      WHILE '(' 表达式 ')' 语句
    | DO 语句 WHILE '(' 表达式 ')' ';'
    | FOR '(' 表达式语句 表达式语句 ')' 语句
    | FOR '(' 表达式语句 表达式语句 表达式 ')' 语句
    | FOR '(' 声明 表达式语句 ')' 语句
    | FOR '(' 声明 表达式语句 表达式 ')' 语句
   
68★跳转语句  →
      GOTO IDENTIFIER ';'
    | CONTINUE ';'
    | BREAK ';'
    | RETURN ';'
    | RETURN 表达式 ';'


如果哪里翻译有误或者有更准确的表达方式,欢迎大家指出:)
回复 支持 反对

使用道具 举报

发表于 2010-8-29 14:46:42 | 显示全部楼层
这个……好多编译原理的书上面都有……C++的应该是这个的两倍还多吧……

另外VB的呢?我只写了VB语法描述的一小部分……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-29 16:51:33 | 显示全部楼层
这个……好多编译原理的书上面都有……C++的应该是这个的两倍还多吧……acme_pjz 发表于 2010-8-29 14:46


是吗?我怎么看了那么多书没发现有C的完全语法说明呢?
C++的有吗?凭直觉应该不会2倍吧,1.2倍就差不多了,就是多了 private、public 之类的来修饰成员变量、函数嘛,加上个 class 的语法……
回复 支持 反对

使用道具 举报

发表于 2010-8-29 23:09:55 | 显示全部楼层
13# VBProFan

不止哟,还有模板、模板类、模板特化等一堆稀奇古怪的功能……
回复 支持 反对

使用道具 举报

发表于 2010-8-30 08:13:08 | 显示全部楼层
C++最爽的就是模板了,实现源码级的重用
自从用了C++喂口好了,吃麻麻香,一口气上五楼还不喘

不过模板+虚函数以汇编方式调试起来不简单。。。幸好vs支持源码调试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-30 12:42:48 | 显示全部楼层
也是,差点忘了模板了。跟 #define 比起来,预处理器不但要对模板进行替换展开,还要进行语义分析,实例化数据类型。
回复 支持 反对

使用道具 举报

发表于 2010-8-30 21:30:19 | 显示全部楼层
16# VBProFan

估计模板展开不是预处理器干的,而是语法分析器……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-21 19:02:58 | 显示全部楼层
打印版:

ANSI C YACC.rar

8.77 KB, 下载次数: 244

回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-23 08:43:47 | 显示全部楼层
找到一篇好文:
http://blog.csdn.net/JsuFcz/archive/2008/11/18/3331107.aspx
使用Lex和Yacc开发C语言的编译器
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-26 23:48:02 | 显示全部楼层
发现有一条 YACC 的产生式是错误的:

struct_declarator
        : declarator
        | ':' constant_expression
        | declarator ':' constant_expression
        ;

选项一没问题,相当于
int a;
选项三也没问题,相当于
int a:5;
传说中的位域;
选项二相当于
:5;
经试验,编译错误。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2023-3-22 03:45

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表