编译技术图示(第二章 实现一个简单的编译器)

编译技术图示(第二章 实现一个简单的编译器)

  • 辨析:
    • 表达式———————有值
    • 语句———有分号————
  • 语法和语义分开定义规则
  • 源代码—(词法分析,分割分类)—>单词符号流—(语法分析,与BNF语法规则)—>抽象语法树/Token序列

1、语法定义BNF


 

1.1描述方法

1)词法定义:词素/终结符(不可分解),eg:关键字

2)语法定义:非终结符,eg:while语句

3)用大小写区分这两类语法成分

4)语句先用汉语说出来,最后用英文描述(eg:“stmt”语句)

    表示中用符号:“—>”表示(具有如下形式,左词素句/非终结符句,右语句名/非终结符名),“|”或者

1.2检验是否符合语言规则——规则放旁边“—>”

1)归约:由具体到抽象(自下而上)将所有终结符化为非终结符

2)推导:由抽象到具体(自上而下)将所有非终结符化为终结符

  • 递归下降分析法
    • 规则:  
    • 每个非终结符对应一个解析函数
    • 语法规则右侧为其左侧非终结符对应的“函数体”
    • 关于函数体:  
      • 右侧终结符对应从输入串中消耗(advance)该终结符    
      • 右侧非终结符对应函数调用    
      • “|”对应“if-else”语句    
  • 两个函数模式:
    • 1)void:  
      • 终结符:if!match(){报错;结束}advance();消耗    
      • 函数调用:直接调用    
    • 2)int:  
      • 终结符:if!match(){报错,return 0}advance();消耗    
      • 函数调用:if!match(函数调用){报错;return 0}advance();消耗    
        • 最后位直接 return函数调用;      
  • ‘+’与‘-’属于ASCⅡ,可用match()
  • 空串(|ε):遇到不符前规则则认为遇到空串,则判正(原本判负),但不消耗此终结符。(空串是想要多少个就有多少个)
  • 递归调用A{A B }死循环,A{B A}
  • ?优化:基于事实再做决策

 

猜你喜欢

转载自www.cnblogs.com/ggotransfromation/p/11609589.html