跪求原理实验源码 !!!!!!!!!!用LEX 、bison实现词法分析、语法分析以及生成中间代码
J5175 2011-06-17 01:15:09 词法分析
一、实验目的
设计、编制并调试一个C语言子集的LEX源程序,采用自动生成工具LEX生成该C语言子集的词法分析程序——C源代码文件,编译产生可执行程序,并运行、调试。
二、实验要求
待分析的C语言子集的词法
A、 关键字
main
if
else
int
return
void
while
B、 专用符号
= + - * /
< <= > >= ==
!= ; : , (
) [ ] { }
C、 其他标记ID和NUM
通过以下正规式定义其他标记:
IDENT ->letter (letter|digit)*
NUMBER ->digit digit*
Letter->a | … | z | A | … | Z
Digit -> 0 | … | 9
D、 空格由空白、制表符和换行符组成
空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。
C子集 文法
1 概述
本项目的目的是生成一个用于教学的示例性质的C语言编译器,标准的C文法比较复杂,而本编译器采用的是经过裁剪的C子集文法,具有基本运算、循环、分支和输入、输出功能。
2 文法
<加法运算符>::= +|-
<乘法运算符>::= * |/
<关系运算符>::= <|<=|>|>=|!=|==
<字符>::= _|a|...|z|A|...|Z
<数字>::= 0|<非零数字>
<非零数字>::= 1|...|9
<字符串>::= "{<合法字符> }" //字符串中可以出现所有合法的可打印字符集中的字符
<程序>::= [<常量说明部分>][<变量说明部分>]{<子函数定义部分>}<主函数>
<常量说明部分>::= const<常量定义>{,<常量定义>};
<常量定义>::= <标识符>=<整数>
<整数>::= [+|-]<非零数字>{<数字>}|0
<标识符>::= <字符>{<字符>|<数字>}
<声明头部>::= int <标识符>
<变量说明部分>::= <声明头部>{,<标识符>};
<子函数定义部分>::= (<声明头部>|void <标识符>)<参数><复合语句>
<复合语句>::= ‘{’[<常量说明部分>][<变量说明部分>]<语句序列>‘}’
<参数>::= ‘(‘<参数表>‘)’
<参数表>::=int<标识符>{,int<标识符>} | <空>
<主函数>::=void main’(‘‘)’<复合语句>
<表达式>::=[+|-]<项>{<加法运算符><项>}
<项>::=<因子>{<乘法运算符><因子>}
<因子>::=<标识符>|’(‘<表达式>‘)’|<整数>|<子函数调用语句>
<语句>::=<条件语句>|<循环语句>|’{‘<语句序列>‘}’|<子函数调用语句>;|
<赋值语句>; | <返回语句>;|<读语句>;|<写语句>;|;
<赋值语句>::= <标识符>=<表达式>
<条件语句>::= if’(‘<条件>‘)’<语句>[else<语句>]
<条件>::= <表达式><关系运算符><表达式>|<表达式>
<循环语句>::= while’(‘<条件>‘)’<语句>
<子函数调用语句>::= <标识符>‘(‘<值参数表>‘)’
<值参数表>::= <表达式>{,<表达式>}|<空>
<语句序列>::= <语句>{<语句>}
<读语句>::= scanf’(‘<标识符>‘)’
<写语句>::= printf’(‘<字符串>,<表达式 >|<字符串>|<表达式 >‘)’
<返回语句>::= return [ ‘(‘<表达式>‘)’]