1. 文法 G(S):

(1)S -> AB

(2)A ->Da|ε

(3)B -> cC

(4)C -> aADC |ε

(5)D -> b|ε

验证文法 G(S)是不是 LL(1)文法?

解:因为

First(Da)={b, a}
First(ε)={ε}
First(aADC)={a}
First(b)={b}
Follow(A)={c.b.a, #}
  FIRST(B)
  FIRST(D), FIRST(C), FOLLOW(C)
Follow(C)={#}
Follow(D)={a,#}

所以

SELECT(A->Da)={b. a}
SELECT(A->ε)={c. b, a, #}
SELECT(C->aADC)={a}
SELECT(C->ε)={#}
SELECT(D->b)={b}
SELECT(D->ε)={a, #}

其中因为SELECT(A->Da)与SELECT(A->ε)有交集所以该G(S)不是LL(1)文法。

2.判断下列文法是否是LL(1)文法?

E -> TE'
E' -> +TE' | ε
T -> FT'
T' -> *FT' | ε
F -> (E) | i

解:由题可得

SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(i) ={i}

其中SELECT(E'->+TE')与SELECT(E'->ε)互不相交,SELECT(T'->*FT')与SELECT(T'->ε)互不相交,SELECT(F->(E))与SELECT(F->i)互不相交,故原文法为LL(1)文法。

3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

E()

    {T();

       E'();

     }

E'()

T()

T'()

F()

解:

SELECT(E->TE) =FIRST(TE')=FIRSI(T)-FIRST(F)U{*}={(, i, *}
SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T -> FT')=FRIST(FT')=FIRST(F)={(, i}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(i) ={i}

伪代码:

void ParseE(){
  switch(lookahead){
    case '(','i', '*':
      ParseT();
      ParseEP();
      break;
    default:
      print("语法错误 \n");
      exit(0);
  }
} void ParseEP(){
  switch(lookahead){
    case '+':
      MatchToken('+');
      ParseT();
      ParseEP();
      break;
    case '#', ')':
      break;
    default:
      print("语法错误 \n");
      exit(0);
  }
} void ParseT(){ 
  switch(lookahead){
    case '(','i':
      ParseF();
      ParseTP();
      break;
    default:
      print("语法错误 \n");
      exit(0);
  }
}
void ParseTP(){
  switch(lookahead){
    case '*':
      MatchToken('*');
      ParseF();
      ParseTP();
      break;
    case '#', ')', '+':
      break;
    default:
      print("语法错误 \n");
      exit(0);
    }
  }
void ParseF(){
  switch(lookahead){
    case '(':
      MatchToken('(');
      ParseE();
      MatchToken(')');
      break;
    case 'i':
      MatchToken('i');
      break;
    default:
      print("语法错误 \n");
      exit(0);
    }
  }

  

 4.加上词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

最新文章

  1. js中function函数
  2. Android-monkey稳定性测试(多台设备同时进行)
  3. 动态改变actionbar上menu的图标
  4. React Native开发技术周报2
  5. windows 下的定时任务
  6. Java Hour 9
  7. java 写的能够响应浏览器请求的 http 服务器
  8. 关于PowerBuilder 9.0中如何修改项目工程名字
  9. Appium Android Bootstrap源码分析之简介
  10. BDD框架:behave学习记录
  11. [编织消息框架][JAVA核心技术]异常基础
  12. BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]
  13. 找不到BufferedImage这个Class的解决方法
  14. 记录一次群答问:jmeter正则提取器提取一个及多个值
  15. 进程初识和multiprocessing模块之Process
  16. 注册Docker Hub、以及Push(九)
  17. MyBatis 作用域(Scope)和生命周期
  18. 使用JUnit测试预期异常
  19. Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现
  20. c# 阿拉伯数字转成中文

热门文章

  1. 大数据之Linux基本指令
  2. C和C++从零开始系列(一)
  3. ARTS-S golang常用代码段
  4. 测底稳定NIOS开发之一:将nios产生的编程文件转换成jic (连载)
  5. 虚拟链路(virtual-link)
  6. 设置QQ环境变量
  7. LNMP-Nginx负载均衡
  8. Python异常体系结构图
  9. Redis面试热点工程架构篇之数据同步
  10. hdu 1054 Strategic Game (简单树形DP)