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

漫谈计算机语言

静态语言是代码经过编译之后,类型就确定了,典型代表就是Java。静态语言可以通过IDE来进行类型错误检查。而动态语言类型错误无法在编译期检查出来,会在运行期出现。为了帮助大家更好的理解,直接上代码。...首选我们需要定义BNF。通过BNF来判定源代码是否符合该规范。下面,以Java的Class的BNF为例。...略 ... } 编译器首先读取public这个token,同时,由于编译器事先知道BNF,那么 它知道public是modifier是符合语法的。...然后,编译器读入class,同BNF进行比较,符合语法的。直到编译器读入extend,发现和BNF规定的不相符,提示错误。...如果源代码符合BNF规则,则继续进行词法分析、语法分析、语义分析等等,这里就不做过多介绍了,我会在后续文章中详细介绍的。

1.4K240

JavaScript 语言通识 — 重学 JavaScript

这类的语言有一个特点,就是它的语法没有一个严格的定义,所以我们叫它做 “非形式化语言”,典型的代表就是我们平时说的这些。...其他产生式 除了乔姆斯基谱系可以用 BNF 来定义,其实还有很多的不同的产生式的类型。比如说后来出现的 EBNF、ABNF,都是针对 BNF 的基础上做了语法上的扩张。...现代语言的分类 现代语言的特例 C++ 中,* 可能表达乘号或者指针,具体是哪个,取决于星号前面的标识符是否被声明为类型 VB 中,的开始,取决于当前位置是否可以接受...—— 说明在编程语言里类型转换发生的形式 强类型:无隐式转换(类型转化是不会默认发生的) 弱类型:有隐式转换(JavaScript 就是典型的弱类型的语言,默认把 Number 转换成 String...类型然后相加后给你得到一个 String 类型,还有 String 和 Boolean 双等运算,会先把 Boolean 转成 Number 然后再跟 String 去做是否相同的对比) 复合类型 结构体

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

    理解递归下降分析和parsec应用

    前言 本文将会从上下文无关文法开始介绍,从使用 BNF 描述语法到理解递归下降分析思想,最后实现一个简单的 html 解析器收尾。...使用 BNF 描述一下 js 中的简单语法,例如 数组语法: js 中数组源代码为: [1] [1, 2, 3] [1, 2, 3, ] 复制代码 用 bnf 表示: 一个元素 ARRAY ::= "[...最后 使用 BNF 描述语法,然后按照 BNF 编写 语法单元 parser,最后将 parser 组合起来成为完整的 parser,这就是 Parser Combinators。...应用价值: 在编写 BNF 的时候,可以更好的理解编程语言语法设计理念。有助于写出能够被编译器优化的语法。...静态文本处理,对于一些有语法规则的文本,可以编写一个 parser 来处理它,如文本搜索,代码重构等。 6. 附录 上述代码仓库链接:github.com/Saber2pr/ht… 参考 [1].

    1.7K00

    thriftpy+ply源码分析

    对比自然语言的话,英语中的每个单词都是token,token有很多类,比如non(名词)就是一个类token,apple就是属于这个类型的一个具体token。...那么yacc做的事情就是这一部分(实际应该说是BNF来做的)。 yacc会帮我们生成一个yyparse函数,这个函数会不断调用上面的yylex函数来得到token的类型。...有几点要注意: 自定义语言的要做的事情必须可以能通过C语言来实现。...定义各种token类型。他们在.y中定义,这些token既会被lex使用到,也会被.y文件中的BNF使用到。 写词汇分析代码。这部分代码在.l文件(就是lex的输入文件)中。...这块的定义方式是:正则表达式-->对应操作。如果和yacc一起来使用的话,对应的操作通常是返回一个token类型,这个token的类型要在yacc中提前定义好。 写BNF。

    67310

    浅谈C语言中的类型声明

    现在从内向外理解,这是一个指针,指向一个数组,数组的元素是指针。 如何验证 空口无凭。不实际测试一下也无法说明刚刚分析的准确性。但是验证并不容易,有什么能直观表示变量类型的呢?答案还是有的。...std::type_info对象有一个成员函数name,可以返回一个含类型名称的字符串。嘛,总之先写个程序试试。...举几个例子: int [] => Pi int [3] => Pi int [4][5] => A5_Pi 指针类型… 指针类型的编码比较简单,即 P类型> 同样类似语法的还有左值引用(R,C++...不过这个仅仅是简单的总结,所以这一小节让我们再进一步深究下去,来从C语言的BNF文法中理解类型声明的语法。 BNF范式 如果你对BNF范式有一定了解,请跳过这一段直接去看“分析”节。...——巴科斯范式 WIkipedia 简而言之,BNF如是表示语法: ::= 的表达式> 表达式相当于一些字符串,多个表达式可以用’|’分隔。

    1.7K20

    python的解释器spython介绍

    比如protocolbuff、thrift这些通过定义语法文件生成代码的这类工具,对语法解析的效率要求不高,那么这个版本的VM再这些领域还是有很大的参考价值。   内部实现层次: ?...但是仍然没有找到很大头绪,后来我就在python.org上一顿逛,也下载了python的源码分析,源码目录有python的BNF描述文件,因为我已经看过一遍编译原理了,BNF就看的很懂,从头到尾读了一遍了以后...BNF就是完整的解析python语法的流程说明啊!...,这样在c++实现解析python语法的时候,就可以从顶向下按照这个BNF尝试解析,如果不满足这个BNF语法要求的就报错。...这个跟原生的python是有区别的,原生python的数字对象可以表达任意数字,但是为了实现简便,做了简化处理,这也是参考了lua的实现方式每token对象会记录所属的行号,方便语法报错提供有用的信息。

    86450

    从编译原理看一个解释器的实现

    在编译原理领域,使用一个通用的表示方法来描述语法,这个方法就是上下文无关文法或BNF范式。...语法分析树 如果非终端节点A有一个产生式A->XYZ,那么在语法分析树中就可能有一个标号为A的内部节点,该节点有三个子节点,从左向右标号为X,Y,Z。...语法分析器根据Token构建抽象树,对应的类是Parser 我在一开始就提到过,游戏里的『公式』很像数学表达式,那么数学表达式有什么广泛和通用的特点?...算术表达式的BNF构建 通过对数学表达式的了解,我们知道一个数学表达式有数字、运算符等组成,并且运算符是左结合和有优先性,那怎样去构建它的BNF范式呢?...请注意,任何由括号括起来的表达式都是一个因子。 这个BNF范式的语法分析树为如下所示: ?

    2.2K100

    在同一基准下对前端框架进行比较

    github: https://github.com/gothinkster/realworld 是否有大量的拥趸者并不重要。唯一要求是它是否出现在了 RealWorld 的代码仓库页面上。 ?...大小 应用有多大?我们只会比较已编译的 JavaScript 文件的大小。CSS 对所有变体都是通用的,并从 CDN(内容分发网络)下载。HTML 也适用于所有变体。...简述 越早进行绘制和工作,用户的体验就越好。 ? 表现得分(0-100)—— 越高越好 注意:由于缺少 Demo程序,因此跳过了 PureScript。...Svelte —— 能够隐身的 UI 框架 —— 这是真正适用于它的妙语。Stencil 这个基准测试中的新手也表现不错。两者都相对较新,正在推动大小方面的限制。...你还想知道哪一个是最好的吗?最好的应该是能够满足你需求的那个! 问:你喜欢类型吗?

    96020

    实现JavaScript语言解释器(二)

    上面我们使用了最直白的中文表达了Simple语言的一小部分语法规则,在实际工程里面我们肯定不能这么干,我们一般会使用巴克斯范式(BNF)或者扩展巴克斯范式(EBNF)来定义编程语言的语法规则。...如何实现语法解析 在我们编写完属于我们语言的BNF规则之后,可以使用Yacc或者Antlr等开源工具来将我们的BNF定义转化成词法解析和语法解析的客户端代码。...我们需要从要解决的领域特定问题出发,对于Simple语言它就是:将Simple语言的BNF语法规则使用TypeScipt表达出来。...在上面BNF的介绍中,我们知道BNF主要有三种规则:option,repeat和or。每个规则之间可以相互组合和嵌套,等等,互相组合和嵌套?你想到了什么JavaScript语法可以表达这种场景?...tokenBuffer.isEmpty()) { // 如果到最后还有没有被解析完的Token就表明编写的代码有语法错误,需要报错给开发者 const firstToken = tokenBuffer.peek

    60810

    编程语言的 IDE 支持

    语法分析 对于开发工具来说,语法分析有几个重要的功能: 语法高亮,是指根据术语类别来显示不同的颜色与字体以增强可读性的一种编辑器特性。...Textmate、VS Code 基于 JSON 的正则匹配方式:Language Grammars 基于语法分析器(如 BNF)生成中间代码 Jetbrins 基于 BNF 生成代码的方式:Grammar...,从长度上来说,我看到的这个版本有 1831 行。...语法分析器分析 由于先前编写系统分析工具 Coca 和通用语法分析器 Chapi ,我对于 BNF 的词法也是颇为上手的——实际上不难。...其它 剩下的就是一些比较有意思的功能,诸如于: fileType。文件图标支持。即某一类型的文件,使用特定的图标来展示。 commet 。即按下注释的快捷键,能快速的注释和反注释代码。

    2.4K31

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

    像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。...John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法。 BNF的元符号: ::=表示“定义为”,有的书上用–>|表示“或者”尖括号用于括起非终结符。...但是正则表示式的表达能力有限,她无法表达括号配对等语法形式,因而,需要引入表达能力更强的上下文无关文法。编译程序中常用正则文法表示词法,用上下文无关文法表示语法。...语言中有些规则使用上下文无关文法仍然无法描述,例如变量的定义在使用之前,类型匹配等等,这些通常称为(静态)语义,它们在编译程序的静态语义检查阶段进行检测。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.1K20

    手写一个解析器

    这样的邮箱地址是否合法;又可能你需要实现类似于 Excel 里面表达的功能,例如用户输入 =C1+C2+"123",你需要把 C1 的内容和 C2 的内容和字符串 "123" 拼接起来。...用 BNF 来表示你的 DSL 语法 BNF 的全称是 Backus–Naur form,是一种表示上下文无关语法的表示方式,Nearley 的语法基于 BNF 的扩展 EBNF(Extended Backus–Naur...预定义了一些常用的语法,这段代码的意思是引入了 Nearley 预定义的数字语法,空格语法和字符串语法。...它的运行结果将会作为整条产生式的运行结果。 至此如何书写 BNF 就介绍完了,你可以已经发现了,正则表达式也可以用 BNF 来表示,事实上正则也是上下文无关的问题,自然也就可以用 BNF 来表示。...生成 Parser 生成 Parser 会用到我们之前介绍到的 Nearley 框架,首先我们将上面给出的 BNF 语法定义保存到 grammar.ne 文件里。

    1.2K41

    笨办法学 Python · 续 练习 33:解析器

    BNF 语法 尝试从头开始编写一个 RDP 解析器是没有某种形式的语法规范的,有点棘手。你还记得当我要求你将单个正则表达式转换成 FSM 吗?这很难吗?它需要更多的代码,不只是正则表达式中的几个字符。...最常见的“语法的正则表达式”被称为 Backus–Naur Form(BNF),以创作者 John Backus 和 Peter Naur 命名。...BNF 描述了所需的记号,以及这些记号如何重复来形成语言的语法。BNF 还使用与正则表达式相同的符号,所以*,+和?有相似的含义。...对于这个练习,我将使用 https://tools.ietf.org/html/rfc5234 上面的 IETF 增强 BNF 语法,来规定上面的微型 Python 代码段的语法。...params 在 BNF 中我将params定义为了新的“语法产生式”,或者“语法规则”。意思是在我的 Python 代码中,我需要一个新的函数。

    58520

    从0开始自制解释器——添加对乘除法的支持

    BNF范式与上下文无关文法 巴科斯范式 以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。...BNF表示语法规则的方式为:非终结符用尖括号括起。每条规则的左部是一个非终结符,右部是由非终结符和终结符组成的一个符号串,中间一般以“::=”分开。...相信到这里小伙伴应该明白BNF范式的一些基本概念和使用方式了。 我们再来插入一个题外话,既然这里提到BNF范式是一种上下文无关文法,那什么是上下文、什么是上下文无关。...但是这里我们定义的文法有一个问题,就是从文法上体现不出运算的优先级。学过小学数学的都知道算数运算中优先计算乘除法,最后算加减法。但是根据这个文法我们无法体现出乘除法的优先级。因此这里我们需要修改定义。...\n"); } return 0; } 上述expr的定义就是由一个term加若干个 +|- 和后面的若干个term 来组成,因此这里有一个循环。

    50720

    图灵奖12 —— 约翰·巴克斯,Fortran和BNF的发明人,却有着不幸的童年

    1 介绍 该文档是约翰·巴克斯的一个简单的传记,约翰·巴克斯是20世纪有影响力的计算机科学家。他参与研发了FORTRAN, ALGOL等语言,以及帮助创建了BNF范式,用于程序设计语言的语法。...类型声明的形式为(I1, I2,...), In),其中type是类型的名称,Ij是要声明该特定类型的标识符。...巴克斯开始研究一种新的形式来描述编程语言的语法。受逻辑学家埃米尔·波斯特(Emil Post)的启发,巴克斯写下了后来被称为BNF(巴克斯诺尔形式)的IAL的全部语法。...近20年后,他不再那么确定自己的想法是否真的来自马丁·戴维斯(Martin Davis)关于埃米尔·波斯特(Emil Post)著作的一门课程。...戴维斯说他直到很久以后才开始教这门课: 这里有一个奇怪的困惑。我发誓,学习语法的想法来自埃米尔·波斯特,因为我曾在兰姆庄园(位于哈德逊河畔的IBM智库)上过马丁·戴维斯的课。

    1.6K20

    Policy Engine 的前世今生

    假设我们一次要验证 500 部电影是否在现在的时刻,在美国加州,使用 iphone 允许访问,假定平均的规则数是 5,每验证 3/5 的规则才能确定是否允许播放,那么我们需要执行 300 次规则才能完成验证...这样的话,我们把匹配规则的工作变成了表达式执行的操作,效率一下子高了一个数量级。不过表达式执行的难点在于,如何用合适的工具将其转化成语法树,使之可以执行。...我们知道,在 C 的领域,有 flex / bison(大学期间编译原理使用的 lex / yacc 的升级版),由于我们的系统是 nodejs 构建的,直接用有诸多不便,所以我们选用了 jison —...突然间,我一闪念:何不用找找 elixir 撰写的 BNF 工具,在 elixir 下面解析出语法树,然后利用 macro 生成适合 pattern matching engine 优化的代码?...ABNF 的语法比较别扭,tokenization 还需要显式地声明空白字符,不像 EBNF 直接写一句所有空白字符都 skip 就可以不必关心了。

    1.5K140

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

    jison有很多demo可以供参考,比如 写一个计算器 https://gerhobbelt.github.io/jison/try/图片要实现这个计算器,你的代码不再是手写解析算术表达式,手写语法树解析...语法定义通常使用BNF或EBNF表示。2.实现DSL的解析器:DSL解析器是将DSL代码解析为计算机可执行的指令的程序。解析器通常使用词法分析器和语法分析器来实现。...其中词法分析器,语法分析器这些都有非常稳定的工具,比如,如果有定义好的BNF范式,直接丢给 flex 就可以解决词法分析的这个过程,然后在丢给 yacc,就可以按照这个规则编译出可执行程序,也许你会觉得这个非常不可思议...OK,立即这些,就看看其中的一些概念,对于新手可能需要科普一下:BNF或EBNF简单的描述BNF(巴克斯-诺尔范式)和 EBNF(扩展巴克斯-诺尔范式)是一种用于描述编程语言结构的形式语法。...EBNF是BNF的一个扩展,添加了更多的元素来描述更复杂的语言结构。

    2.5K41

    编译原理初学者入门指南

    歪个楼,这里有一个吊诡的事实,yaml 竟然是图灵完备的!...关于 BNF 具体定义,这里摘抄一下维基百科,后面做详细解说: BNF 规定是推导规则(产生式)的集合,写为: ::= 的表达式> 这里的 是非终结符,而表达式由一个符号序列...分词(最常见的是 jieba 分词) 词法分析的产物是有含义的 token,下面都需要进行语法分析(即 parser),NLP 里通常会做 向量化(最常见的是 word2vec 方法) 这两步完成后,...Lex 函数的返回值类型(即词法分析器的实际产物)需要在后面的 yacc 文件的 token 部分定义。...3.4 语法分析器 上节我们有说,yacc 文件最终会生成 go 源代码文件,里面包含了 yyParse 、yyText 、yyLex 等接口的具体实现。

    2.4K21
    领券