在第7,8章我们分别学习了Pascal控制语句的解析,解释执行,还涉及到了一点点优化,虽然好像花的时间不多,但是用Antlr之后就会发现还是很啰嗦。Antlr对于编译器作者来说,或许不是性能最好的,但是对于语言前期的论证,运行时原型的快速构建都有非常重要意义,尤其语法较多(也就是EBNF Rule条数很多)。更进一步说,即使有很多优化,Antlr的源代码和代码生成(Codegen)这一块完全可以定制。我们可以在语言,运行时稳定之后来个手写版:)。好了,废话不多说了,先看控制语句的语法。

==>> 本章中文版源代码下载:svn co http://wci.googlecode.com/svn/branches/ch8_antlr/ 源代码使用了UTF-8编码,下载到本地请修改!

控制语句的语法

这几个控制语句,FOR最复杂,CASE其次,下面的语法描述严格遵循第7章的分析树显示。

   1: statement:
   2:   compound_statement | assignment_statement | control_statement;
   3: control_statement:
   4:   while_statement | repeat_statement | for_statement | if_statement | case_statement;
   5: while_statement:
>^(LOOP ^(NOT $t1) $s1);
   7: repeat_statement:
>^(LOOP $s1 $t1);
   9: for_statement 
  10: @init{
  11:   PascalNode id_node = null;
  12:   PascalNode id_cp1=null;
  13:   PascalNode id_cp2=null;
  14:   PascalNode id_cp3=null;
  15:   PascalNode op_node=null;
  16:   boolean increment = true;

  18:   ((PascalAntlrToken)one_constant.getToken()).setValue(new Integer(1));
  19: }:
  20:   (FOR a1=assignment_statement {
  21:           id_node =(PascalNode) ((PascalNode)a1.getTree()).getChild(0); 
  22:           id_cp1 = (PascalNode)id_node.dupNode(); 
  23:           id_cp2=  (PascalNode)id_node.dupNode();
  24:           id_cp3=  (PascalNode)id_node.dupNode();
  25:          }

>^(LT {id_cp1} $e11))
>^(COMPOUND $a1 ^(LOOP ^(TEST $q) $s2 ^(ASSIGN {id_cp2} ^({op_node} {id_cp3} {one_constant}))));
  29: if_statement:
> ^(IF $t1 $s1 $s2?);
  31: case_statement:
>^(SELECT $e1 $bhs);
  33: case_branches:
> case_branch+;
  35: case_branch:
>^(SELECT_BRANCH $c1 $s1);
  37: constant_list:
> ^(SELECT_CONSTANTS constant+);
  39: constant:
  40:   NUMBER | NUMBER_REAL | STRING;

相关文章:

  • 2021-07-28
  • 2021-08-13
  • 2022-01-30
  • 2021-07-25
  • 2021-12-10
  • 2022-01-14
  • 2021-11-27
  • 2021-11-20
猜你喜欢
  • 2021-08-05
  • 2021-09-02
  • 2021-07-05
  • 2021-10-27
  • 2021-10-20
  • 2021-11-20
  • 2021-12-07
相关资源
相似解决方案