编译原理(五) 语言的定义

简介: 编译原理(五) 语言的定义

自然语言的文法

<句子>  ->  <名词短语 > <动词短语>
<名词短语> -> <形容词> <名词短语> 
<名词短语> -> <名词>
<动词短语> -> <动词> <名词短语>
<形容词> -> little
<名词> -> boy
<名词> -> Apple
<动词> -> eat

单词串 little boy eats apple


推导

给定文法 G = (Vt, Vn, P, S),如果 a -> b ∈ P 那么可以将符号串rag 中的a换成b 也就是说 rag可以重写为rbg

记作 rag => rbg

此时称作文法符号串rag直接推导rbg

也就是用产生式的右部替换产生式的左部


如果a0 => a1, a1 => a2, a2 => a3

那么 可以记作 a0 => a1 => a2 => a3

称作a0经过3步推导出a3,可以简记为a0 =>³ a3


a =>0 a

=> + 表示经过正数步推导

=> * 表示经过若干步推导,可以是0步


我们再来看最开始那个自然语言文法

<句子> =>  <名词短语> <动词短语>
      =>  <形容词><名词短语><动词短语>
      =>  little <名词短语><动词短语>
      =>  little  <名词>   <动词短语>
      =>  little  boy     <动词><名词短语>
      =>  little  boy     eats <名词短语>
      =>  little  boy  eats  <名词>
      =>  little  boy  eats  apple

这种从上到下推倒下来的过程叫做推导

错从下到上推回去叫做 归约


句型

如果S =>* a, a ∈ (Vt ∪ Vn)* 则称a是G的一个句型

一个句型中即可包含终结符又可包含非终结符,也可能是空串

若 S=>* w, w ∈ Vt* 则称w是G的一个句子

句子是不高喊非终结符的句型


由文法G的开始符号S推导出的所有橘子构成的集合称为文法G生成的语言, 记为L(G)

L(G) = {w | S => * w, w ∈ Vt*}

文法 E-> E+E | E * E | (E) | id

生成的语言中包含无穷多个句子


例 : 文法G

S -> L | LT

T -> L | D | TL | TD

L -> a | b | c | … | z

D -> 0 | 1 | 2 | 3 | … | 9


T => TL

=> TDL

=> TDDL

=> TLDDL

=> TD…LDDL

可以无限走下去 T表示字符数字串

该文法生成的语言是标识符


相关文章
|
5月前
|
存储 Python 容器
常量与变量:计算机编程中的基本概念
在计算机编程中,常量和变量是两个非常重要的概念。它们分别代表了在程序中固定不变的值和可以变化的值。了解这两个概念对于编写有效、可维护的代码至关重要。本文将详细讨论常量和变量的概念,并通过示例代码来展示它们在编程中的应用。
192 0
|
8天前
|
Java 编译器 程序员
1.5 高级计算机语言和编译器
高级编程语言,如C和Java,通过更接近人类思维方式的指令简化了编程过程,使得开发者能够在更抽象的层面上表达逻辑,避免了直接操作繁琐的机器语言。编译器作为桥梁,将这些高级语言翻译成不同CPU可执行的机器码,使得代码具有跨平台的潜力,并极大地提升了编程效率与易学性。
37 11
|
3月前
|
存储 Rust 编译器
【Rust学习】03_通用编程概念
您成功了!这是一个相当大的章节:您了解了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!若要练习本章中讨论的概念。
34 2
|
3月前
|
编译器 C语言
C语言编程语法—结构
C语言基础概要:令牌包括关键字、标识符、常量、字符串和符号,如`printf(&quot;Hello,World!\n&quot;);`含5个令牌。分号是语句结束符,注释用`/*...*/`包围。标识符是变量等的名称,以字母、下划线开头,后跟字母、数字。C语言有32个关键字,如`int`,空格用于分隔语句元素,提升可读性。
27 0
|
4月前
|
存储 编译器 程序员
C++语言速成方法
C++语言速成方法
|
4月前
|
自然语言处理 容器
S语言词法分析器设计
还有很多需要优化的地方,作为小白发出了也和大家一起交流下,这次我是分文件写的,因为考虑到以后的实验都用这一套代码,分文件写方便一点,用的是C++14标准
28 0
|
5月前
|
Rust 安全 开发者
Rust中的元编程概念与应用
本文将深入探讨Rust编程语言中的元编程概念,包括宏、特性、元组和元函数等,并展示它们在Rust中的实际应用。元编程允许开发者在编译时操纵代码,实现代码生成、条件编译、类型检查等高级功能。通过本文的讲解,读者将能够更好地理解元编程在Rust中的作用,并学会如何在项目中应用元编程技术。
|
自然语言处理 前端开发 JavaScript
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语
81 0
|
5月前
|
JavaScript 前端开发 Java
静态语言和动态语言,解释和编译
静态语言和动态语言,解释和编译
76 1
|
自然语言处理 JavaScript 前端开发
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)(二)
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)(二)
80 0
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)(二)