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

打破国外垄断,开发中国人自己编程语言(1):编写解析表达式计算器

而且文法还标识了优先级,antlr4规定,写在前面的文法优先级高于写在后面的文法优先级。...当然,可以直接在模块中引用antlr4库,不过将antlr4 运行时库工程放到一起,这样如果将工程复制到其他机器上,就不会由于antlr4运行库没有复制而导致无法运行了。 ?...下面先给出一个可以识别以hello开头词组识别程序文法。...现在来总结一下: Antlr4文法文件是以g4作为扩展名,第一行代码必须以grammar开头,后面跟着语法名,如Hello,该名字必须g4文件名一致。每一行代码都必须用分号(;)分隔。...弄一个可以解析表达式计算器 前面已经给出了一个完整Antlr4案例,不过这个案例太简单了,没什么实际用途,本节会利用Antlr4实现一个有实际价值计算器程序

2.3K40
您找到你想要的搜索结果了吗?
是的
没有找到

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

除了方便表达以外,引入EBNF另一个主要原因是为了更紧密地把文法映射到递归下降分析程序真实代码。当需要手动构造归下降分析程序时候,通常把上下文无关文法改写为EBNF是必需。...除了方便表达以外,引入EBNF另一个主要原因是为了更紧密地把文法映射到递归下降分析程序真实代码。当需要手动构造归下降分析程序时候,通常把上下文无关文法改写为EBNF是必需。...在程序设计语言中,通常用正则表达式描述词法规则。但是正则表示式表达能力有限,她无法表达括号配对等语法形式,因而,需要引入表达能力更强上下文无关文法。...编译程序中常用正则文法表示词法,用上下文无关文法表示语法。那么程序语言中那些属于词法哪些属于语法呢?...一个简单办法,把所有能用正则文法表示规则成为词法,即我们用尽可能使用正则文法表示更多东西,那些无法用正则表示式表示成为句法,如C语言中{ statement; }语法形式。

99920

66. 精读《手写 SQL 编译器 - 语法分析》

1 引言 接着上周文法介绍,本周介绍是语法分析。 以解析顺序为角度,语法分析分为两种,自顶而下自底而上。...通过这张图可以看到 LL 家族 LR 家族能力范围: 如图所示,无论 LL 还是 LR 都解决不了二义性文法,还好所有计算机语言都属于无二义性文法。...另外也有一些根据文法自动生成 parser 库,比如兼容多语言 antlr4 或者对 js 支持比较友好 pegjs。...Antlr4 支持左递归,因此文法可以写成 selectList ::= selectList (, word)? | word,用在我们这个简化代码中会导致堆栈溢出。...左递归自动消除,因为通过文法转换,会改变文法结合律语义,最好能实现左递归自动消除(左递归在上一篇精读 文法 有说明)。 生成语法树,仅匹配语句正确性是不够,我们还要根据语义生成语法树。

1.4K30

Antlr4 语法解析器(下)

Antlr4 两种AST遍历方式:Visitor方式 和 Listener方式。...Antlr4规则文法: 注释:和Java注释完全一致,也可参考C注释,只是增加了JavaDoc类型注释; 标志符:参考Java或者C标志符命名规范,针对Lexer 部分 Token 名定义,..., finally, mode, options, tokens 基于IDEA调试Antlr4语法规则(文法可视化) ?...一般来说,面向程序静态分析时,都是使用访问者模式,很少使用监听器模式(无法主动控制遍历AST顺序,不方便在不同节点遍历之间传递数据) Antlr4词法解析和语法解析 如前面的语法定义,分为Lexer...Spark & Antlr4 Spark SQL /DataFrame 执行过程是这样子: ? 我们看下在 Spark SQL 中是如何使用Antlr4.

3.4K20

85.精读《手写 SQL 编译器 - 智能提示》

智能提示架构 syntax-parser 是一个 JS 版语法分析器生成器,除了类似 antlr4 基本语法分析功能外,还支持专门为智能提示优化功能,后面会详细介绍。...词法分析输入是语法分析输出 Tokens。Tokens 就是一个个单词,Token 结构存储了单词值、位置、类型。 我们需要构造一个执行链条消费这些 Token,也就是可以执行文法扫描程序。...试想如下语句: select c.| from ( select * from dt; ) c; 面对上面这个语句,很显然 c. 没有写完,一般语法树解析器提示你语法错误。...SQL 编辑器封装 我们拥有了内置 “智能提示” 功能语法解析器,定制了一套自定义 SQL 词法、文法描述,便完成了 sql-lexer sql-parser 这一层。...比如在做字段自动提示时,经历了如下判断步骤: 而你只需要实现 onInputTableField,告诉程序每个表可以提供哪些字段,整个流程就会严格层层检查表名提供对原始字段 selectList

3.9K30

C语言】程序编译、预处理

3.链接器同时也会引入标准C函数库中任何被该程序所用到函数,而且它可以搜索程序员个人程序库,将其需要函数也链接到程序中。...而源程序通过编译和链接最终形成可执行程序,但是编译本身也分为几个阶段:预编译/预处理——编译——汇编 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理之后产生结果都放在...小问题:分别对应着ESciso(简单记忆:键盘左上角ESc镜像iso) 下面在这里我们简单来看看各个阶段完成什么工作: 如果想要了解具体是什么样子,可以看一看博主这篇博客:点击前往 2.运行环境...参 数 类 型 宏参数类型无关,只要对参数操作是合法, 它就可以使用于任何参数类型。 函数参数是类型有关,如 果参数类型不同,就需要不同 函数,即使他们执行任务是 不同。...本篇博客主要介绍了程序翻译环境执行环境,以及预处理相关内容,条件编译文件包含等内容,如果觉得不错的话,记得支持一下哦

23120

精读《设计模式 - Interpreter 解释器模式》

代码编译器 程序语言也因为其天然是字符串原因,和 SQL、日常语言都类似,需要一种模式解析后才能工作。...自然语言处理 自然语言处理也是解释器一种,首先自然语言处理一般只能处理日常语言子集,因此先定义好支持范围,再定义一套分词系统文法表达式,并将分词后结果传入灌入了此文法表达式解释器,这样解释器可以返回结构化数据...我们可以直接把文法定义耦合到解释器里,但这样做会导致语法复杂时,解释器难以维护。比较好方式是定义一套解释器解耦文法表达式,通过预处理器最终生成解释器。...总结 解释器是一种思维,将复杂语法解析抽象为一个个独立终结符非终结符各自判断,只要每个文法自己判断做好了,剩下工作就是组装文法。...这种将单个逻辑判断文法组装解耦做法,可以使逻辑判断文法组装独立变换,使复杂语法解析转化为一个个具体简单问题。 版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)

45920

大学课程 | 编译原理知识点

综合属性,基本属性 了解几种运行环境特点:Fortran77 完全静态,不允许递归调用。基于栈CC++,Pascal。...3型文法为:正则文法 4个文法定义是逐渐增加限制 编译器相关程序 (1)解释程序 如同编译器一种语言翻译程序。...编译器不同在于:它立即执行源程序而不是在翻译完成之后才执行目标代码。...(5)预处理器 在真正翻译开始之前由编译器调用独立程序 (6)编辑器 编译器通常接受由任何生成标准文件 ( 例如 ASCII 文件 ) 编辑器编写程序。...•数有效位数。 什么是属性文法 确定语言实体属性或特性,它们必须进行计算并写成属性等式或语义规则,并描述这些属性计算如何语言文法规则相关。这样一组属性和等式称作属性文法

1.2K30

编译原理 | 期末复习笔记

目录 目录 第一章 概论 1. 1 编译过程及程序结构 第二章 文法和语言 第三章 词法分析 3.1 正规式正规文法 3.2 有穷自动机 第四章 自顶向下语法分析方法 4.1 LL(1)文法判别 4.1.1...编译前端:源语言有关,如词法分析、语法分析、语义分析、目标机无关代码优化等机器无关事务 编译前端:目标机器有关,如目标代码生成、目标机有关代码优化 好处:可组装、省力、有利于移植 --...:存在例如 U \rightarrow U 产生式,对描述语言无必要,会引起文法二义性 第三章 词法分析 3.1 正规式正规文法 例如: A=xy: A \rightarrow xB;B \rightarrow...常用LR文法有:LR(0),SLR(1)、LALR(1)、LR(1) 其包含关系结构如图: 一个文法G[S],若列出LR(0)项目集规范族C后,C中没有项目集中有移进-规约冲突,那么该文法G[S...---- 6.2 LR文法判定 6.2.1 LR(0) 一个文法G[S],若列出LR(0)项目集规范族C后,C中没有项目集中有移进-规约冲突,那么该文法G[S]就是LR(0)文法。 ​

1.6K20

编译原理由正规文法构造正规式(正则表达式)

程序设计语言单词可由正则文法产生,例如,标识符定义可由正则文法描述如下: ::=// 显然,该文法描述了以字母开头字母数字串集合。...之所以采用正则表达式来描述,主要基于以下几点原因: 词法规则简单,无需上下文无关文法那样严格表示法,用正则式表示法来理解被定义符号集合比理解由重写规则集合定义语言更为容易; 从正则式构造高效识别程序比上下文无关文法更容易...,P为文法规则,S为识别符或开始符,flag为文法类型,因此下面使用C++中类来为文法定义,并且使用set集合来保存每个文法某些属性(不会重复)。...遇到困难解决方法 ①通常如果只有两个相同非终结符规则S->a,S->b那么可以直接化简为S->a|b,如果存在多个目标结果为S->a|b|c,那么,需要进行特殊处理,可以使用栈或者递归调用来生成多个或式...②闭包*识别,即规则2也是本次实验难点,需要同时识别文法规则左右两边。 ③有时经过规则1、2和3后所得结果仍然不正确,这就需要使用集成开发环境调试工具。增强调试技巧也是非常重要

1.6K20

编译原理学习(到LL1文法部分)

CC++、Pascal等语言是编译执行 java既有编译又有解释 Java → 编译程序 → Bytecode →解释程序 编译过程可分为下面几个阶段: 1. 词法分析 2....语义分析中间代码产生 输入各类语法范畴根据语言语义规则,分析其含义,并进行初步翻译 产生中间代码 中间代码: 结构简单、含义明确记号系统 介于高级语言低级语言之间,目标机无关...语义分析程序中间代码产生器 优化器 目标代码生成器 表格管理 出错处理 遍 :从头到尾对源程序及其内部表示 扫描一次,并作有关加工处理 从源程序扫描是第一遍输入每前一遍输出是后一遍输入...一种程序设计语言字母表是该语言基本字符集合。 C语言字符集:大小写字母a-z A-Z、数字0-9、空白符、标点和特殊符号。 C程序是在C基本字符集上按一定规则构成符号串。...符合C语言语法规则符号串集合{所有C语言基本字符}*子集就是C语言。

63620

C语言进阶(十五) - 预处理程序编译初步解析

前言 本节主要介绍程序运行前预处理(预编译)阶段相关知识。同时简单介绍一个程序是如何从一行行代码到开始运行并得到结果。 ---- 1....预处理 1.1 预定义符号 首先是C语言内置预定义符号。...除非宏比较短,否则可能大幅度增加程序长度。 宏替换在预处理阶段完成,无法进行调试(程序运行时)。 宏是类型无关,这意味着宏不够严谨。(双刃剑)。...链接器同时也会要引入标准C函数库中任何被该程序所用到函数,而且他可以搜索程序员个人程序库,将其需要函数也链接到程序中。...---- 结语 本节主要介绍了预处理阶段涉及概念,了解更深层次程序编译链接知识可以说是在修炼我们内功,仅有本文还远远不够。 ---- END

41120

Chomsky文法类型判断

2型文法所确定语言为2型语言L2,2型语言可由非确定下推自动机来识别。 一般定义程序设计语言文法是上下文无关。如C语言便是如此。因此,上下文无关文法及相应语言引起了人们较大兴趣重视。...3型文法所确定语言为3型语言L3,3型语言可由确定有限状态自动机来识别。 在常见程序设计语言中,多数词法有关文法属于3型文法。...L3 流程图 image.png 代码 文法数据结构:考虑到文法是一个四元组,包含Vn为非终结符,Vt为终结符,P为文法规则,S为识别符或开始符,flag为文法类型,因此下面使用C++中类来为文法定义...2型文法实验结果 ? 3型文法实验结果 ? 困难解决方法 数据结构建立 为了便于以后实验代码复用,需要建立一个良好数据结构类型。...因此本次实验我采用了C++来写,并使用了C++中容器,如set和vector。 文法类型判断方式 这一部分是此次实验重点,如何有效地判断文法类型是一个难题。

1.1K20

65.精读《手写 SQL 编译器 - 文法介绍》

一般用大写 S 表示文法开头,称为开始符号。 终结符非终结符 下面为了方便书写,使用 BNF 范式表示文法。...对于有二义性文法,可以通过 上下文相关文法 方式描述,也就是在产生式左侧补全条件,解决二义性: aBc -> a1c | a2c dBe -> d3e 一般产生式左侧都是非终结符,大写字母是非终结符...上下文无关文法 根据是否依赖上下文,文法分为 上下文相关文法 上下文无关文法,一般来说 上下文相关文法 都可以转换为一堆 上下文无关文法 来处理,而用程序处理 上下文无关文法 相对轻松。...但是当我们将文法粒度变细,将 CASE WHEN WHERE 区块分别交由两块文法解决,将等号这个通用表达式抽离出来,就可以不关心上下文了,这种方式称为 上下文无关文法。...附上一个 mysql 上下文无关文法集合。 左推导右推导 上面提到推导符号 => 在实际运行过程中,显然有两种方向左和右: E + E => ?

53320

NLP入门之形式语言自动机学习(三)

,研究程序设计语言.形式语言在之前我们提定义中就是对程序设计语言形式化描述,这里边我们就可以引申出两种重要方向: 一:研究产生语言形式规则—文法 二:识别语言装置—机器 下边这些文字讨论就是这样顺序和规则...显然,字母表上任意一个字符w空串连接还是w,即εw=wε =w 字符串w逆,用w表示,w是字符串w倒置。如,当w=b1b2…bk,则w=bk…b2b1。空ε逆还是ε,即ε =ε。...比如:设字母表T是C语言中所用全部符号集合,那么语法正确C语言程序也是C语言字母表上语言....例子: 设文法G=(N,T,P,S),其中N= {S,B,C},T= {0,1}, 生成式P如下: S→0C, B→0S, S→1B,B→1BB,C→ 0CC。...B→0,C→1, C→ 1S, 在此例子中,每个生成式左部是单个非终结符,所以是2型文法。 3型文法或称正则法。

1.3K61

第四章 自顶向下语法分析方法

FIRST(bAS)∩FOLLOW(A)=φ,所以当A面临输入符号 i 匹配时,可能出现几种选择?...∪FOLLOW(A)=\{c,a,d,\#\} 1.4 LL(1)文法 1.4.1 定义 一个上下文无关文法是 LL(1) 文法充分必要条件是,对每个非终结符两个不同产生式,A→α,A→β,满足...五、确定自顶向下分析方法 5.1 递归子程序法 5.1.1 原理 用LL(1)文法构造不带回溯自上而下分析程序,一个分析程序对应一组递归过程,每个非终结符对应一个子递归。...子过程功能: 对相应非终结符产生式右部进行语法分析。分析程序从开始符号所对应过程开始运行。...预测分析器模型如下图所示,总控制程序从输入缓冲区得到输入符号,栈顶符号一起在预测分析表中查找选用产生式序列,并根据不同情况修改栈,最终得到一个产生式序列: 图片 总控程序执行时可能动作: 对于任何

1.2K30

SQLite虚拟机

Lemon.c则用于生成lemon可执行程序。 LemonYACC没有本质上不同,都是LALR(1)文法编译器。但lemon有一些改进,主要有: (1)语法更易读和理解,变量不易弄错。...= B+C; } (2)Lemon不使用全局变量,YACC在分析器分词器间使用全局变量。...2.文法编译器 编译文法文件工具。SQLite用Lemon,Lua早期版本用Yacc。编译器编译文法文件,生成语法分析程序。SQLite中生成文件是parse.c。...对于上面的运算,一般会使用如下指令: add a b c; //将bc对应寄存器值相加,将结果保存在a对应寄存器中 基于寄存器指令可以直接对应标准3地址指令,用一条指令完成了上面多条指令计算工作...《程序设计语言编译原理》 作者:陈火旺等。 2.《lexyacc》 JobnR.Levine等。 3. SQLite源码,主要用3.2.8版本 4.

1.4K60

编译原理(第四版)复习 (二)

第三章:词法分析有穷自动机 考察内容就是:已知文法求正规式;已知正规式求文法; 正规式性质: A|B = B|A A|(B|C) = (A|B)|C A(BC) = (AB)C A(B|C) = AB...|AC (A|B)C = AC|BC A(伊姆逊)|(伊姆逊)A = A A* = AA*|(伊姆逊)=A|A* = (A|(伊姆逊))* (A*)* = A* 正规文法到正规式转换: 将正规文法每个非终结符表示成关于它一个正规式方程...若x=ax|b 或(x=ax+b) 则解为x=a*b; 若x=xa|b 或(x=xa+b) 则解为x=ba*; 正规式到正规文法转换...: 令Vt=∑; 对任意正规式R,用一个非终结符S作为文法开始符号; 对A->ab转换成A->aB和B->b; 对A->a*b转换成A->aA|b; 不断运用3和4中规定进行变换,直到每条规则最多含有一个终结符为止...正规式有穷自动机: 利用有穷自动机构造词法分析程序方法是: 从语言单词描述中构造出非确定有穷自动机; 再将非确定有穷自动机转化成确定有穷自动机; 将其化简为状态最少化DFA; 对DFA每个状态构造一小段程序将其转化为识别语言单词词法分析程序

45931
领券