首页
学习
活动
专区
工具
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文法来实现递归下降分析。

50420

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

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

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)叫做上下文无关语言

    32230

    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.7K00

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

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

    2.3K41

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

    例:∑={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表示,采用一些元符号来提高文法规则表法能力。

    31210

    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 ->

    34430

    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

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

    ,含义却可能完全不同,例如: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 上下文无关文法组成 终结符号:组成语言基本符号,在程序语言中是单词符号。

    1.8K10

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

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

    69690

    编译原理学习笔记-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 → 没有人 那么就完全不一样了。

    1.9K11

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

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

    2.6K20

    编译原理:文法分类

    在编译原理课程中,我们知道有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.2K20

    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.1K31

    消除文法左递归

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

    4K30

    JavaScript 语言通识 — 重学 JavaScript

    非形式化语言 中文,英文 形式化语言 (乔姆斯基谱系) 0-型:无限制文法 —— 只要定义清楚了语言是什么样 1-型:上下文相关文法 —— 同样一个词、句组合,它上文、下文和内容相关 2-型:...比如说后来出现 EBNF、ABNF,都是针对 BNF 基础上做了语法上扩张。所以一般来说每一个语言标准里面,都会自定义一个产生式书写方式。...现代语言分类 现代语言特例 C++ 中,* 可能表达乘号或者指针,具体是哪个,取决于星号前面的标识符是否被声明为类型 VB 中,< 可能是小于号,也可能是 XML 直接量开始,取决于当前位置是否可以接受..., 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 声明式

    67231

    C语言】初识C语言(常见C语言概念)

    语言大致可以分为自然语言和计算机语言,自然语言就是人与人日常交流语言,如汉语、英语、日语等等,计算机语言又可以分为机器语言、汇编语言、高级语言C语言就是一个高级语言 机器语言:就是由二进制01组合起来计算机可以直接识别的程序语言是一种面向机器语言...,比起低级语言易懂易学,可移植性好,编程效率高,但是执行效率没有低级语言高,需要经过编译或解释,C语言就是采用编译一种高级语言 二.为什么选择C语言 C语言常年霸榜各类高级语言前三,属于基础必学语言...,其功能强大,而且许多语言都很相似,如果学好C语言,对学习其他语言也有很大帮助 三.编译器选择 C语言是一门编译型语言,需要依赖编译器将计算机语言转换成机器能够执行机器指令 常见编译器有:msvc...将后缀名.cpp改为.c就可以了,创建好后就可以开始写我们第一个C语言程序了 注意:其中.c文件叫源文件,.h文件叫头文件(head),后面会慢慢讲到 五.第一个C语言程序 注:只需要跟着操作,后面会一一解释它们代表着什么...,按ctrl+k,ctrl+u可以取消注释 总结 以上就是今天所要讲C语言常见概念,下次讲C语言数据类型和变量,如果今天内容有不懂还请在评论区留言,当然,还有许多不足地方也请大家多多指正,谢谢

    9610

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

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

    39240
    领券