编译原理的文法与语言

理解符号串与集合运算。

  L={A,B, … ,Z,a,b, … ,z}

  D={0,1, … ,9}

  说明下表示的含义:

  LUD :全部字母和数字的结合的一个集合

  LD :由一个字母后跟一个数字组成的所有符号串的集合

  L4:由4个字母组成的所有符号串的集合

  L*:由字母组成的所有符号串包括空符号串ξ的集合

  D+:由一个或到九个数字全组成的符号串的集合

  L(LUD)*:以字母开头,后跟字母或数字组成的所有符号串的集合

文法G(Z):Z->aZb|ab定义的是什么样的语言?

  Z->aZb|ab

  Z->ab

  Z->aZb->aaZbb->aaaZbbb->aaaaZbbbb->......->anbn

  G(Z)定义的是 anbn

  所以G(Z)是左右对称文法

写出教材22页例2.2中标识符的文法四元组形式(VN,VT,P,S)。

  设I为标识符,L为字母,D为数字

  VN为非空非终结符号,VT为非空终结符号,P为产生式集合,S为开始符号

  P = {

    I -> L

    I -> IL

    I>-> ID

    ......

    L -> a

    D -> 0

    D -> 1

    ......

    D -> 9

  S = I

  G:S ->L | IL | ID

      L -> a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z

      D -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

写出下列表达式的最左推导、最右推导。

  G(E):

  E=> E + T | T

  T=>T * F | F

  F=>(E)| i 

  • i*i+i
  • i+i*i
  • i+(i+i)

  i*i+i

  最左推导:E => E+T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i

  最右推导:E => E+T => E+F => E+i => T+i =>T*F+i => T*i+i => F*i+i => i*i+i

  i+i*i

  最左推导:E => E+T => T+T => F+T => i+T => i+T*F => i+F*F => 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

  i+(i+i)

  最左推导:E => E+T => E+T+T => T+T+T => F+T+T => i+T+T => i+F+T => i+i+T => i+i+F => i+i+i => i+(i+i)

  最右推导:E => E+T => E+F => E+i => E+T+i = > E+F+i => E+i+i => T+i+i => F+i+i => i+i+i => i+(i+i)

原文地址:https://www.cnblogs.com/lzhdonald/p/11505367.html

时间: 2024-08-29 09:54:05

编译原理的文法与语言的相关文章

编译原理之文法和语言总结与梳理

前言 一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包括语法和语义两个方面.所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序.目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具.语法只是定义什么样的符号序列是合法的,与这此符导的含义落无关系,比如对于个Pascal程序来说,一个上下文无关文法可以定义符号串A:一B+C是一个合乎语法的默值语句,而A:=B+就不是.但是,如果B是实型的,而C是布尔理的,或者B.C中任何一个变量没有事

编译原理:文法和语言总结与梳理

1. 梳理第二章的内容,写一篇理解与总结. 一. 对程序设计语言的描述从语法.语义和语用三个因素考虑: 语法:对语言结构的定义: 语义:语言的含义: 语用:从使用的角度描述语言. 形式语言理论是编译的理论基础. 二. 字母表:元素的非空有穷集合: 符号/字符:字母表中的元素: 符号串:符号的有穷序列. 三. 符号串运算: 符号串的连接:εx=xε=x: 集合的乘积:AB={xy|x∈A,y∈B}:{ε}A=A{ε}=A: 符号串的幂运算:x=abc,x^2=abcabc; 集合的幂运算 正闭包A

编译原理学习:TINY语言词法扫描程序实现

最近对解释型程序(类似python或者是linux里的bc计算器)非常感兴趣,就开始学习一下编译原理.今天自己实现了TINY语言的词法扫描程序.大部分参考<编译原理及实践>一书.但是我做了一些小小的改进. 先说一下TINY语言: 1.注释:放在一对大括号内.书上的注释不能嵌套,我做了一点改进,允许嵌套. 2.关键字:read write if end repeat until else 3.类型:只支持整型和布尔型. 4.计算:+ - * / ( ) < = :=,其中:=为赋值运算,=

小白说编译原理-9-最简单minus-c语言编译器

简介 继上节8说到利用手动构建的语法树解析下面的c语言代码: a = 1 sum = 0 input(x) while(a <= x){ sum = sum + a a = a+1; } print(sum) 而一个编译器不应该依赖用户去手动构建对应语言的语法树,我们需要的是一种支持自动构建语法树的策略.本节将要说明的就是如何利用前面1-6节学到的lex,yacc以及符号表,7-8节学到的语法树来支持给定c语言代码自动构建过程. 动机 在第5节变量支持的计算器中,对于expr的语法解析有如下的y

编译原理LL1文法分析树(绘图过程)算法实现

import hjzgg.analysistable.AnalysisTable; import hjzgg.first.First; import hjzgg.follow.Follow; import hjzgg.treenode.TreeNode; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Grap

编译原理 LL1文法First集算法实现

import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; public class First { private Map<String, Set<Character>> first = new TreeMap<String, Set<Character>>();

编译原理LL1文法分析表算法实现

import hjzgg.first.First; import hjzgg.follow.Follow; import hjzgg.tablenode.TableNode; import hjzgg.treenode.TreeNode; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.Stack; im

编译原理LL1文法Follow集算法实现

import hjzgg.first.First; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; public class Follow { private Map<String, Set<Character>> first = null; private Map<St

对编译原理的认识

认识:编译原理是把我们编写的高级语言通过一定的算法转换生成机器执行的二进制代码. 好处:学习编译原理可以让我们对语法和数据结构有一个更深层次的认识,可以让我们理解机器是如何理解高级语言的,我们可以学习其中的思想运用到我们构建编写代码过程中,减少错误代码的出现以及能快速写出整洁的代码,也可以方便我们进行代码优化.学好了还可以自己编写一个新的编译器以及编写出一个新的高级语言. 损失:不学习编译原理我们对C语言等一些底层语言了解无法深入,让我们学习的知识有缺陷和形成断层.编译器的编写需要运用编译原理的