递归下降分析法
2015-12-30 16:35
232 查看
#include<stdio.h>
char curr;
char YF[300];
int N=-1;
void T();
void E();
void F();
void e();
void t();
void error();
void scaner();
void main()
{ char ch;
int i=0;
printf("请输入需要分析的curr语法:(以#结束)\n");
do{
scanf("%c",&ch);
YF[i] = ch;
i++;
}while(ch != '#');
scaner();
E();
if(curr == '#')
printf("成功!\n");
else{
printf("文法有误!!\n");
error();
}
}
void scaner(){
N++;
if(YF
== ' '){
N++;
}else{
curr = YF
;
}
}
void E(){
T();
e();
}
void T(){
F();
t();
}
void e(){
if(curr == '+'){
scaner();
T();
e();
}
else if(curr == '-'){
scaner();
T();
e();
}else if(YF[N+1] == '#' || YF[N+1] == '+' || YF[N+1] == '/' || YF[N+1] == '*' || YF[N+1] == '-'){
if(YF
!= '(' && YF
!= ')')
error();
}
}
void t(){
if(curr == '*'){
scaner();
F();
T();
}else if(curr == '/'){
scaner();
F();
T();
}else if(YF[N+1] == '#' || YF[N+1] == '+' || YF[N+1] == '/' || YF[N+1] == '*' || YF[N+1] == '-'){
if(YF
!= '(' && YF
!= ')')
error();
}
}
//LIE ZHI HUA TI GONG TAI MA
void F(){
if(curr == '('){
scaner();
E();
if(curr == ')'){
scaner();
// printf("111111");
}else{
error();
}
}else{
while(1){
if(curr >= 'a' && curr<='z' || curr >= 'A' && curr <= 'Z' || curr >= '0' && curr <= '9'){
scaner();
}else{
break;
}
}
}
}
void error(){
printf("%d %c之后的文法有错!\n",N,curr);
}
char curr;
char YF[300];
int N=-1;
void T();
void E();
void F();
void e();
void t();
void error();
void scaner();
void main()
{ char ch;
int i=0;
printf("请输入需要分析的curr语法:(以#结束)\n");
do{
scanf("%c",&ch);
YF[i] = ch;
i++;
}while(ch != '#');
scaner();
E();
if(curr == '#')
printf("成功!\n");
else{
printf("文法有误!!\n");
error();
}
}
void scaner(){
N++;
if(YF
== ' '){
N++;
}else{
curr = YF
;
}
}
void E(){
T();
e();
}
void T(){
F();
t();
}
void e(){
if(curr == '+'){
scaner();
T();
e();
}
else if(curr == '-'){
scaner();
T();
e();
}else if(YF[N+1] == '#' || YF[N+1] == '+' || YF[N+1] == '/' || YF[N+1] == '*' || YF[N+1] == '-'){
if(YF
!= '(' && YF
!= ')')
error();
}
}
void t(){
if(curr == '*'){
scaner();
F();
T();
}else if(curr == '/'){
scaner();
F();
T();
}else if(YF[N+1] == '#' || YF[N+1] == '+' || YF[N+1] == '/' || YF[N+1] == '*' || YF[N+1] == '-'){
if(YF
!= '(' && YF
!= ')')
error();
}
}
//LIE ZHI HUA TI GONG TAI MA
void F(){
if(curr == '('){
scaner();
E();
if(curr == ')'){
scaner();
// printf("111111");
}else{
error();
}
}else{
while(1){
if(curr >= 'a' && curr<='z' || curr >= 'A' && curr <= 'Z' || curr >= '0' && curr <= '9'){
scaner();
}else{
break;
}
}
}
}
void error(){
printf("%d %c之后的文法有错!\n",N,curr);
}
相关文章推荐
- 利用jQuery中的serialize方法大量获取页面中表单的数据,发送的服务器
- mysql 查看binlog 操作日志及恢复数据
- 062 - Unique Paths
- 备忘录实现过程
- hdu1087
- 数据结构 JAVA描述(六) 图的创建 (邻接矩阵+邻接表)
- WEB程序员需要掌握的十大MySQL优化技巧
- 递归下降语法分析程序设计
- 061 - Rotate List
- Style Scope Agile Edition―免费版商业智能产品
- postgresql学习line
- 解决android sdk无法访问Google的问题
- eclipse重新设置workspace路径
- JavaScriptCore在实际项目中的使用的坑
- AOP(2)
- iOS9 搜索API
- how to write one native program based on android source build system
- KVC设置unfinderKey和与系统关键字相同key的解决
- Linux下安装Tomcat7
- iOS通过dSYM文件分析crash