首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法

用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言...用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(3)- 词法分析 用c语言手搓一个...600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现...用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC...这时就需要对文法进行改造。 实际上,EBNF文法就是为了映射递归下降分析法的具体程序实现而设计的,因此我们这里就用EBNF文法来实现递归下降分析。

53220

上下文无关文法产生的语言都可以用正则文法来描述_c语言结构体默认值

除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。...事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。...事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。...除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。...一个简单的办法,把所有能用正则文法表示的规则成为词法,即我们用尽可能的使用正则文法表示更多的东西,那些无法用正则表示式表示的成为句法,如C语言中的{ statement; }语法形式。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    文法和语言

    文法的定义 文法的形式定义 四元组:G=(VT,VN,P,S)G=(V_T,V_N,P,S)G=(VT​,VN​,P,S) VTV_TVT​:终结符集合 终结符是文法所定义的语言的基本符号。...语言的定义 推导和归约 给定文法G=(VT,VN,P,S)G=(V_T,V_N,P,S)G=(VT​,VN​,P,S),α->β∈P 把一个字符串的α替换成β,我们把这叫做直接推导 通俗来讲就是用产生式的右部替换产生式的左部...0步推导就是它本身 +正闭包:不包括0步推导 *克林闭包:包括0步推导 归约是推导的逆过程 句型和句子 语言的形式化定义 L(G)就是所有句子的集合。...文法分类体系 0、1、2、3型文法 0型文法 无限制文法,对于任意一个推导式α->β,α中至少包含一个非终结符 由0型文法G生成的语言L(G)叫做0型语言。...由上下文有关文法(1型文法)生成的语言L(G)叫做上下文有关语言。 2型文法 α必须属于终结符。 由上下文无关文法(2型文法)生成的语言L(G)叫做上下文无关语言。

    32530

    用c语言手搓一个500+行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1

    项目github地址及源码: https://github.com/yunwei37/tryC 这一章开始进入解释器的核心部分: 语法分析器; 我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算...BNF与上下文无关文法 Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述...Algol 60编程语言的语法。...这时就需要对文法进行改造。 实际上,EBNF文法就是为了映射递归下降分析法的具体程序实现而设计的,因此我们这里就用EBNF文法来实现递归下降分析。...来看看怎样用递归下降文法计算tryC中的表达式 上面说了一大堆,现在看看实际的计算表达式的实现是怎样的呢 算术表达式 tryC中需要计算四则运算表达式的EBNF文法如下: exp -> term { addop

    1.8K00

    编译原理 第二章上: 字母表和符号串 文法概述

    例:∑={a,b,c},∑={0,1}字母表不能出现相同的符号,字母表同时要求非空2.1.2 符号串由字母表中的0个或多个符号组成的任何有穷序列。...后缀是:abc,bc,c,ε4.子串前缀+后缀,去掉重复的5.字符串的连接:按序连接6.字符串集合A与B的乘积:依次排序,不重不漏。...句子:按一定规则由单词构成的集合(C),C属于星闭包B。程序:部分句子的集合(D),则D属于C2.2 文法1.什么是文法?文法是对语言结构的定义与描述,即从形式上描述和规定语言结构,也称为语法。...2.语法规则:通过建立一组规则(产生式),来描述语言中句子的语法结构,规定用“::=”表示“由...组成”或"定义为..."3.由产生式推导句子推导方法:从一个要识别的符号开始推导,即用相应产生式的右部来替代产生式的左部...2.2.2 文法的EBNF表示先说文法的BNF(巴克斯-诺尔范式),下面是一个BNF的例子EBNF为扩充的BNF表示,采用一些元符号来提高文法规则的表法能力。

    34610

    懂前端的你也可以轻松定义自己业务的DSL

    OK,立即这些,就看看其中的一些概念,对于新手可能需要科普一下:BNF或EBNF简单的描述BNF(巴克斯-诺尔范式)和 EBNF(扩展巴克斯-诺尔范式)是一种用于描述编程语言结构的形式语法。...EBNF是BNF的一个扩展,添加了更多的元素来描述更复杂的语言结构。...上面这一堆精准定义的规则都是一些上下文无关文法,要准确写出flex可以用的规则,必须对上下文无关文法比较熟悉,比如不能出现左递归、不能出现空规则等等:上下文无关文法上下文无关文法(Context-Free...上下文无关文法是自然语言处理、编译原理和计算机语言设计等领域中广泛使用的一种形式化表示方法。要轻松写一个上下文无关文法,可以按照以下步骤进行:1. 确定终结符号集和非终结符号集。...起始符号是文法中唯一的一个非终结符号,表示整个文法的起点。通常用大写字母来表示起始符号。4. 检查文法的合法性。文法需要满足一些条件,如不能存在左递归、不能出现空规则等。

    2.5K41

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言...用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(3)- 词法分析 用c语言手搓一个...600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现...用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(6)- 语义分析:符号表和变量、函数 项目github地址及源码: https://github.com/yunwei37/tryC...tryC的语法分析 完整的tryC EBNF文法: (这里我们用单引号包裹那些在BCNF文法定义中出现但又作为终结符出现的字符) exp -> term { addop term } term ->

    35230

    Milvus 向量数据库如何实现属性过滤

    Expr definition PlanAST execution 查询表达式的文法规则 Milvus 支持的查询表达式 如下图所示,Milvus 运用 EBNF 语法,此处用等式和语法图体现了 Milvus...由于 EBNF 本身就是一个递归的结构,LogicalExpr 既可以是这四条组合起来的整体,也可以是其中单独的某个节点,并且可以继续嵌套下去。...例如图中的表达式 “SP =100;" ,ANTLR 自带的语言识别器 LEXER 会生成四个 token,再各自进行解析生成 Parse-Tree。...上图为表达式的一个 UML 的图,是 C++ 中根据 proto 结构去实现类的继承关系结构图,包含各个 Expr 的基类与派生类。...首先从 C++ 接收到一个 proto 类型的 PlanNode,经过 C++ 内部的 ProtoParse 得到 segcore 类型的 PlanNode。

    1.6K30

    NLP入门之语言模型以及n元文法

    在前几篇我的关于形式语言的文章中,我们大致可以理解到形式语言有以下的几个缺陷: 1:比如像汉语,英语这样的大型的自然语言系统,形式语言就比较难以构造精确的文法. 2:形式语言的逻辑规则太过于复杂,实际上并不符合我们的学习语言的习惯.... 3:有一些句子.比如你这句子的文法是正确的,但是实际上在我们的生活中是不可能发生的,形式语言是无法识别这些句子的....,但是实际上却是现自然语言的基础甚至是瓶颈. 2:语言模型 语言模型在自然语言处理中占有着重要的地位,特别是在基于统计模型的语音识别,机器翻译,分词和文法分析中都是有这广泛的应用,因为我最近在学习n元语法模型...就按照三元文法为例: 在之前的介绍中,我们可以认为这是一个词的概率实际上只是跟前边的词有关,那么就可以有以下的方程: 为了使p(wi|wi-1)对于i=1有意义,我们需要加一个句首标记,为了使概率之和为...0.06,这也就是n元文法的一个简单应用.

    3.1K50

    NLP入门之语言模型以及n元文法

    在前几篇我的关于形式语言的文章中,我们大致可以理解到形式语言有以下的几个缺陷: 1:比如像汉语,英语这样的大型的自然语言系统,形式语言就比较难以构造精确的文法. 2:形式语言的逻辑规则太过于复杂,实际上并不符合我们的学习语言的习惯.... 3:有一些句子.比如你这句子的文法是正确的,但是实际上在我们的生活中是不可能发生的,形式语言是无法识别这些句子的....,但是实际上却是现自然语言的基础甚至是瓶颈. 2:语言模型 语言模型在自然语言处理中占有着重要的地位,特别是在基于统计模型的语音识别,机器翻译,分词和文法分析中都是有这广泛的应用,因为我最近在学习n元语法模型...就按照三元文法为例: 在之前的介绍中,我们可以认为这是一个词的概率实际上只是跟前边的词有关,那么就可以有以下的方程: ?...这个句子出现的概率为0.06,这也就是n元文法的一个简单应用. 下一篇文章我们将讲述下模型的选择以及模型的性能评估.

    70290

    编译原理学习笔记-2:文法和语言

    以 m = abc 为例,它的头是 ε,a,ab,abc;它的尾是 ε,c,bc,abc。而它的固有头不考虑末尾符号 c,固有尾不考虑首部符号 a。...文法 2.1 文法在语言体系中的位置 语言包括语法和语义两个方面,但是语法和语义都是比较抽象的东西,所以我们需要借助一些工具来阐述它们。以语法来说,文法就是阐述它的一个工具。...image.png 2.2 文法的形式定义 文法是描述语言语法结构的形式规则。它的形式化定义是一个四元组,即 G = { VN , VT , P , S }。...以上面文法为例,011 就是句子。 语言:文法产生的句子的全体就构成了语言,记作 L(G)。以上面文法为例,L(G) = { 011,11 }。 3....但是如果定义上下文有关文法 G‘: Grammar → X Y Z X → 我 | 学校 我 Y → 我去 学校 Y → 学校没有 去 C → 去公园 没有 C → 没有人 那么就完全不一样了。

    2K11

    编译原理:第二章 文法和语言

    ,含义却可能完全不同,例如:x=y 在C语言中表示赋值表达式,在Pascal语言中为关系表达式。...字母表: 符号的非空有穷集合,如 {0,1} 表示二进制数语言的字母表,程序设计语言的字母表是该语言的基本字符集。 C语言是C程序的集合,C程序是在C基本字符集上定义的,按一定规则构成的符号串。...,是文法G的字母表 3.3 文法描述的约定 用大写字母A、B、C…或汉语词组代表非终结符号 用小写字母a、b、c…代表终结符号 用希腊字母α、β、γ…代表终结符号和非终结符号组成的符号串 若干个左部相同的产生式可以合并为一个...3.6 文法G描述的语言 由文法G产生的所有句子的集合为:L(G)={α|S=^+>α \ 且\ α∈V_T^*} 文法G的作用:以有限的规则描述无限的语言现象。...image-20210910114400712.png 五、上下文无关文法及其语法树(重点) 5.1 上下文无关文法组成 终结符号:组成语言的基本符号,在程序语言中是单词符号。

    2K10

    基于中文法律知识的大语言模型——LaWGPT

    最近这些天,github的排行榜每天都在发生着变化。昨天我们介绍了位于榜首的用于生成图片的StableStudio,今天我们介绍一款目前高居第二位的基于中文法律知识的大模型—LaWGPT。...LaWGPT:基于中文法律知识的大语言模型 LaWGPT 是一系列基于中文法律知识的开源大语言模型。...该系列模型在通用中文基座模型(如 Chinese-LLaMA、ChatGLM 等)的基础上扩充法律领域专有词表、大规模中文法律语料预训练,增强了大模型在法律领域的基础语义理解能力。...局限性 由于计算资源、数据规模等因素限制,当前阶段 LawGPT 存在诸多局限性: 1.数据资源有限、模型容量较小,导致其相对较弱的模型记忆和语言能力。...E5%90%88%E5%B9%B6%E8%84%9A%E6%9C%AC

    3K20

    编译原理:文法的分类

    在编译原理课程中,我们知道有4种文法:0型、1型、2型、3型。本文将对他们的区别进行描述。 0型文法 0型文法是“无限制文法”、“短语结构文法“,它对产生式几乎没有限制。...对于任意的产生式\alpha \Rightarrow \beta , 0型文法要求,产生式左部的\alpha至少包含1个非终结符。 1型文法 1型文法称为“上下文有关文法”(CSG)。...2型文法 2型文法称为“上下文无关文法”(CFG)。2型文法要求其产生式左部必须为非终结符。只要满足这个条件,产生式的左部就能替换成右部的符号。...2型文法的产生式的一般形式为: A \Rightarrow \beta 3型文法 3型文法又称为“正则文法”(RG)。它分为左线性文法和右线性文法两种。...四种文法之间的关系 四种文法是逐级限制的关系:

    1.5K20

    C++11正则表达式 ECMAScript文法

    C++11提供了Regex类.可以用来完成: 1.Match: 将整个输入拿来比对(匹配)某个正则表达式。 2.Search:查找“与正则表达式吻合”的子序列。...3.Tokenize:正则表达式作为分割器,得到分割器之前的字符串。...[0-9]\.20[0-9]{2} 表示german format,如 24.12.2010 C++11默认使用 ECMAScript 文法,告诉你怎么构造正则表达式 表示式 意义 . newline...以外的任何字符 [...] ...字符中的任何一个 [^...] ...字符之外的任何一个 [ [:charclass:]] 指定字符串类charclass中的一个(见下表) \n,\t,\f,\r,\...设定群组(group) \1,\2,\3 第n个group(第一个group的索引为1) \b 一个正字词边界,字词的起点或终点,不知道什么意思 \B 一个负字词的边界,字词的非起点或非终点 ^ 一行的起点

    1.2K31

    消除文法的左递归

    ,把间接左递归文法改写为直接左递归文法,然后用消除直接左递归的方法改写文法。...如果一个文法不含有回路,即形如PP的推导,也不含有以ε为右部的产生式,那么就可以采用下述算法消除文法的所有左递归。...代换后的Q不含有直接左递归,将其代入S,S的规则变为S→Sabc/ abc/ bc/ c。 此时,S存在直接左递归。...Q和R的规则是多余的,将其删除并化简,最后得到文法G[S]为: S→abcS’/ bcS’/ cS’ S’ →abcS’/ ε 当然如果对文法非终结符排序的不同,最后得到的文法在形式上可能不一样,但它们都是等价的...在消除过程中要判断两个量,一个是|的位置,另一个是非终结符的位置,由于合并的文法串中有多个|,并且会生成新的转换的文法,因此需要用while语句进行处理,直到所有文法的形式不再变化为止。

    4.1K30

    JavaScript 语言通识 — 重学 JavaScript

    非形式化语言 中文,英文 形式化语言 (乔姆斯基谱系) 0-型:无限制文法 —— 只要定义清楚了语言是什么样的 1-型:上下文相关文法 —— 同样的一个词、句的组合,它的上文、下文和内容相关的 2-型:...比如说后来出现的 EBNF、ABNF,都是针对 BNF 的基础上做了语法上的扩张。所以一般来说每一个语言的标准里面,都会自定义一个产生式的书写方式。...现代语言的分类 现代语言的特例 C++ 中,* 可能表达乘号或者指针,具体是哪个,取决于星号前面的标识符是否被声明为类型 VB 中,的开始,取决于当前位置是否可以接受..., HTML, XAML, SQL, CSS 编程语言 C, C++, Java, C#, Python, Ruby, Perl, PHP, Go, Perl, Lisp, T-SQL, Clojure...命令型语言 C, C++, Java, C#, Python, Ruby, Perl, JavaScript 编程语言的性质 图灵完备性 命令式 —— 图灵机 goto if 和 while 声明式

    67831

    侃一侃编译原理的“文法”

    就跟看没字幕的美剧一样,真是痛苦。╮(╯﹏╰)╭ 中文有中文的语义、语法、句子、句法、文法,那么编程语言也有自己的语言系统。...(ˇˍˇ) 想~ 所以说,上下文无关文法不能用来描述自然语言,但是对于当今的程序语言来说,上下文无关文法基本够用了。下文中的“文法”,如果没有特殊说明,都是之指“上下文无关文法”。...其中的“|”代表“或”,是一种元语言符号。 三.文法与语言的推导 假设G是一个文法,S是开始符号,如果S经过零步或者若干步推出α,那么称α是一个句型。只包含终结符号的句型是一个句子。...文法G产生的所有句子构成一门语言,记为L(G)。 那么怎么从文法推导出它代表的语言嘞? 为了方便,我们引入一些符号。...对于程序语言来说,我们常常希望它的文法是非二义性的,但是,只要我们能够控制和驾驭文法的二义性,文法二义性的存在也不一定是坏事。 现在已经证明了,文法二义性是不可判定的。

    71320

    简易理解设计模式之:解释器模式——语言和文法

    它的定义为:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。...先理解一些概念 语言: 指有限字符组成的字符串集合,也就是中文、英文、日语、德语…但对于程序员来说语言就是abcd这类字符了。 文法: 文法是用来描述语言的语法成分结构构造的形式规则。...概括一下: 假设我们现在的形式语言的字符表是‘a’、‘b’、‘c’、‘d’、‘e’、‘f’这6个字符,我们又有ab开头ef结尾中间排列N(N>=0)个cd的字符串。...a、b、c、d、e、f这些语言中的字符不能继续被推导了,称为终结符号。...语言和文法 简易理解设计模式之:访问者模式——员工考核例子

    40140
    领券