编译原理学习笔记(二)——高级语言及其语法描述

学习笔记

一、程序语言的定义


  1. 任何语言实现的基础是语言的定义
  2. 程序语言主要由语法语义两方面定义

语法

  1. 字母表:一个有限的字符集
  2. 单词结构:语言中具有独立意义的最基本结构
  3. 语法单位 :由单词符号构成的结构
    一般包括:表达式,语句,分程序,函数,程序
  4. 语法是一组规则,用这组规则可以产生形式上正确的程序,由此法规则语法规则组成
  5. 词法规则:合法单词的构成规则,就是如何从字母表中选择字符构成一个合法单词,用有限状态自动机正规式描述。
  6. 语法规则:合法程序的构成规则,就是如何把各个也就是如何把各个单词符号组成更大的语法单位(语句、程序),用上下文无关文法进行描述

语义

  1. 对于一个语言来说,不仅要给出它的词法、语法规则,而且要定义它的单词符号和语法单位的意义。这就是语义问题。
  2. 语义是指这样的一组规则,使用它可以定义一个程序的意义。
  3. 语义描述方法属性文法基于属性文法的语法制导翻译方法

二、上下文无关语法


  1. 字母表:由若干元素组成的有限非空集合,用表示,它的每个元素称为一个符号。
  2. 符号串: 由∑中的符号所构成的有穷序列。
  3. 符号串的前缀和后缀及子串:设x是一个符号串,将x的尾(前)部删掉几个字符后形成的符号串,称为x的前(后)缀;从一个符号串中删去他的一个前缀和后缀后所剩下部分称为x的子串
  4. 空字:不包含符号的序列称为空字,记为⊱。
  5. 符号串的连接运算设x和y是两个符号串,如果将y直接拼接在x之后,称这种操作为符号串的连接
  6. 符号串的方幂一个符号串与其自身的n-1的任意连接称为次符号串的n次幂,记作:x^n
    特别地:x^0=∈;
  7. 符号串集合V自身的n次(连接)积记为:
    Vn = V V…V (n个V)
    规定 V0 = {∈}.
  8. V的闭包
    令: V* = V0∪V1∪V2∪…
    称 V*是V的闭包
  9. V的正则包(正闭包,正则闭包):
    记V+ = VV*, 称 V+是V的正则包,即V+=V1∪V2∪V3∪…
  10. 归纳起来,一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式。
    形式上定义一个上下文无关文法G是一个四元式(VT,VN,S,P)
  11. 所谓终结符号乃是组成语言的基本符号,即在程序语言中以前屡次提到的单词符号,如基本字,标识符,常数,算符和界符等.
  12. 所谓非终结符号(也称语法变量)用来代表语法范畴。
  13. 开始符号是一个特殊的非终结符号,它代表所定义的语言中我们最感兴趣的语法范畴
  14. 产生式(也称为产生规则或简称规则)是定义语法范畴的一种书写规则。
    一个产生式的形式是 A→ α
    其中箭头左边的A是一个非终结符,称为产生式的左部符号;
    箭头右边的α是终结符号或与非终结符号组成的一符号串,称为产生式的右部,或称候选式。
  15. 假定G是一个文法,S是它的开始符号。
    如果S ( (表示从S出发,经0步或若干步可推出),则称是一个句型。
    仅含终结符号的句型是一个句子。
    文法G所产生的句子的全体是一个语言,将它记为L(G).

三、语法分析树与二义性


  1. 语法分析树:简称语法树。用来表示推导过程。
    1. 语法树的根结由开始符号所标记。
    2. 随着推导的展开,当某个非终结符被它的某个候选式所替换时,这个非终结符的相应结就产生了下一代新结点。每个新结点和其父亲结点间都有一条连线。
    3. 在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结自左至右排列起来就是一个句型。
  2. 如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。
  3. 文法二义性的问题
    • 文法二义不等于语言二义
    • 文法的二义性是不可判定的
    • 文法的二义性证明:找出一个句子,它有两个不同的最左推导或最右推导
    • 文法二义性的消除:给每个产生式定义优先级
  4. 消除文法二义性示例

    一个二义文法
    E—>E+E
    E—>E*E
    E—>(E)
    E—>i
    二义原因分析
    没有定义运算符优先级和结合性
    消除方法
    定义优先级和结合性
    引入新的非终结符,建立新的产生式
    消除下面文法中的二义性(左结合)

    原文法消除后
    E—>E+EE—>E+T
    E—>iT—>i
  5. 上下文无关文法的几点限制

    • 文法中不含任何下面形式的产生式: P→P因为这种产生式除了产生二义性外没有任何用处
    • 每个非终结符P必须有用处
      这一方面意味着,必须存在含P的句型;也就是,从开始符号出发,存在推导s⇨*αPβ
      另一方面意味着,必须存在终结符串 γVT γ ∈ V T ∗ ,使得P +γ ⇒ + γ ;也就是,对于P不存在永不终结的回路
  6. 形式语言鸟瞰
    乔姆斯基把文法分为四种类型:0型,1型,2型,3型
  7. 0型文法
    0型强于1型,1型强于2型,2型强于3型。这几文法的差别在于对产生式施加不同的限制
    G=(VT,VN,S,P) G = ( V T , V N , S , P ) 是一个0型文法,如果它的每个产生式是这样的结构
    α β
    α∈(V NVT) N ∪ V T ) ∗ 且至少有一个非终结符,而β∈(V NVT) N ∪ V T ) ∗
  8. 1型文法
    产生式的形式为α→β
    其中|α|≤|β|,S→ε除外,但S不得出现与任何产生式的右部
    另一种定义形式:
    αAβαγβ α A β → α γ β
    该文法所描述的语言又称上下文有关语言
  9. 2型文法
    特点:该文法的产生式满足:
    A→α
    A为非终结符,α为终结符和非终结符组成的符号串,可以是空串
    该文法又称为上下文无关文法
    该文法所描述的语言又称为上下文无关语言
  10. 3型文法
    特点:该文法的产生式满足:
    A→αB或A→Bα
    AA为非终结符, α为终结符组成的符号串,可以是空串
    该文法又称为右线性文法,或左线性文法,通称正规文法
    该文法所描述的语言又称为正规语言(用来描述词法规则)

课后习题

  1. 令文法 G6 G 6
    N→D|ND
    D→0|1|2|3|4|5|6|7|8|9
    (1) G6 G 6 的语言L( G6 G 6 )是什么?
    (2)给出句子0127、37、568的最左推导和最右推导
    解:
    (1)L( G6 G 6 )=0~9数字组成的字符串
    (2)最左推导:
    N⇨ND⇨NDD⇨NDDD⇨DDDD⇨0DDD⇨01DD⇨012D⇨0127
    N⇨ND⇨DD⇨3D⇨34
    N⇨ND⇨NDD⇨DDD⇨5DD⇨56D⇨568
    最右推导:
    N⇨ND⇨N7⇨ND7⇨N27⇨ND27⇨N127⇨D127⇨0127
    N⇨ND⇨N4⇨D4⇨34
    N⇨ND⇨N8⇨ND8⇨N68⇨D68⇨568

  2. 写一个文法使其语言是奇数集,且每个奇数不以0开头。
    解:
    G(S):
    S→A|BCA
    A→1|3|5|7|9
    B→A|2|4|6|8
    C→B|0|ε|CC

  3. 令文法为
    E→T|E+T|E-T
    T→F|T*F|T/F
    F→(E)|i
    (1)给出i+i*i、i*(i+i)的最左推导和最右推导
    (2)给出i+i+i、i+i*i和i-i-i的语法树
    解:
    (1)最左推导
    E→E+T→T+T→F+T→i+T→I+T*F→i+F*F→i+i*F→i+i*i
    E→T→T*F→F*F→i*F→i*(E)→i*(E+T)→i*(F+T)→i*(i+T)→i*(i+F)→i*(i+i)
    最右推导
    E→E+T→E+T*F→E+T*i→E+F*i→E+i*i→T+i*i→F+i*i→i+i*i
    E→T→T*F→T*(E)→T*(E+T)→T*(E+F)→T*(E+i)→T*(T+i)→T*(F+i)→T*(i+i)→F*(i+i)→i*(i+i)
    (2)
    这里写图片描述
    这里写图片描述
    这里写图片描述

  4. 证明下面的文法是二义的S→iSeS|iS|i
    iiiei
    S→iSeS→iiSeS→iiieS→iiiei
    S→iS→iISeS→iiieS→iiiei

  5. 改为无二义性的S→SS|(S)|()
    S→TS|T
    T→(S)|()

  6. L1:S→ABC A→a|aA B→b|bB C→c|cC|ε
    L2:S→ABC A→a|aA|ε B→b|bB C→c|cC
    L3:S→A|B|AB A→aAb|ε B→aBb|ε
    L4:S→AB A→1|1A|ε B→0A0|ε

感悟

编译原理是一门基于语言规则的总结性科学,学习这门课将会对我们学习编程进阶提供必要的帮助
(逃 ε=ε=ε=(~ ̄▽ ̄)~
(→_→)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
语法分析是编译原理中的重要部分,它的作用是将词法分析阶段得到的词法单元序列转换成抽象语法树(AST)或语法分析树(Parse Tree),以便于后续的语义分析、中间代码生成和目标代码生成等环节的进行。在本次实验中,我们将使用Java语言实现一个简单的语法分析器。 实验要求: 1. 实现自顶向下的递归下降分析器。 2. 支持的文法如下: ``` <program> ::= <stmts_list> <stmts_list> ::= <stmt> | <stmts_list> <stmt> <stmt> ::= <if_stmt> | <while_stmt> | <assign_stmt> <if_stmt> ::= if <condition> then <stmts_list> end <while_stmt> ::= while <condition> do <stmts_list> end <assign_stmt> ::= <id> = <expr> <condition> ::= <expr> <relop> <expr> <expr> ::= <term> | <expr> <addop> <term> <term> ::= <factor> | <term> <mulop> <factor> <factor> ::= <id> | <number> | '(' <expr> ')' <relop> ::= '<' | '>' | '=' | '<=' | '>=' | '<>' <addop> ::= '+' | '-' <mulop> ::= '*' | '/' <id> ::= <letter> | <id> <letter> | <id> <digit> <number> ::= <digit> | <number> <digit> <letter> ::= A | B | ... | Z | a | b | ... | z <digit> ::= 0 | 1 | ... | 9 ``` 注意:文法中的关键字 if、then、end、while、do、and 等均为保留字。 3. 实现的语法分析器应具备以下功能: - 能够识别出语法正确的程序,并输出相应的语法分析树或抽象语法树。 - 能够识别出语法错误的程序,并给出相应的错误提示信息。 - 能够处理注释和空格等无意义的字符。 4. 实验提交要求: - 实验报告,包括程序设计和实验结果分析。 - 程序源代码。 实验设计思路: 1. 根据给定的文法,设计语法分析器的语法规则和对应的产生式。 2. 编写相应的Java代码,将文法转换为递归下降分析器所需要的形式。 3. 实现从输入的源代码中读取词法单元序列的功能。 4. 实现递归下降分析器的核心算法,对输入的词法单元序列进行语法分析,并构建相应的语法分析树或抽象语法树。 5. 在语法分析过程中,需要处理注释和空格等无意义的字符,以便于正确识别语法错误。 6. 在语法分析过程中,需要对输入的源代码进行错误检查,并给出相应的错误提示信息。 7. 输出语法分析树或抽象语法树,以便于后续的语义分析、中间代码生成和目标代码生成等环节的进行。 实验结果分析: 经过实验测试,我们的语法分析器能够正确地识别出合法的程序,并输出相应的语法分析树或抽象语法树。同时,它也能够正确地识别出语法错误的程序,并给出相应的错误提示信息。总的来说,本次实验取得了较好的实验效果。 实验源代码: 见下方代码框:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值