首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Python基础、进阶与实战

    BNF 表示法:深入了解 Python 的语法

    /python-bnf-notation/ 在阅读Python文档的时候,你可能已经遇到过BNF(Backus–Naur form)表示法: 文档中的BNF 下面我们将了解BNF表示法,并使用它来理解Python 理解BNF表示法 BNF是上下文无关语法的元语法符号。计算机科学家经常使用这种符号来描述编程语言的语法,因为BNF可以精确描述编程语言。 我们构建完了一个full name的BNF规则。下面我们在BNF Playground网站中测试这个规则。 Python的BNF变体 Python 使用 BNF 表示法的自定义变体来定义语言的语法。 熟悉BNF表示法。可以编写BNF规则并在BNF Playground网站中测试。 2. 了解Python的BNF变体。 3. 分解规则。将规则分成多个部分来阅读。 4. 识别非终止符。

    89410编辑于 2024-03-05
  • 来自专栏AIGC 先锋科技

    南洋理工提出简单如精细理念,通过双向负反馈损失进行LLM定位 !

    根据上述发现,作者提出了一种新颖的齐次性损失,双向负反馈(BNF)损失。如图1所示,在优化BNF损失时,部分偏导数仅在(即初始状态)时达到最大值。 对于推理基准测试,BNF 的性能下降明显低于 SimPO(Meng et al., 2024)和 DPO,表明 BNF 在价值对齐和推理能力之间可以实现更好的平衡,从而支付较少的对齐税。 这些实验结果表明,偏好优化对于改进模型在QA任务上的性能至关重要,并证明了作者提出的BNF可以提供与最强偏好优化 Baseline 相当或更好的性能。 BNF支付最低对齐税。 BNF的统一对数几率增加导致独特的位移模式。有趣的是,BNF与DPO和IPO相比显示出更大的对数几率移动(图2(b)和2(e)),这也需要一个参考模型。 这可能是因为BNF在每次位置的每个首选 Token 上统一增加输出对数似然,在softmax归一化后得到一致的对数似然。 BNF 使位移均匀地分布在 Token 上。

    39010编辑于 2025-01-01
  • 来自专栏木可大大

    漫谈计算机语言

    首选我们需要定义BNF。通过BNF来判定源代码是否符合该规范。下面,以Java的Class的BNF为例。 略 ... } 编译器首先读取public这个token,同时,由于编译器事先知道BNF,那么 它知道public是modifier是符合语法的。 然后,编译器读入class,同BNF进行比较,符合语法的。直到编译器读入extend,发现和BNF规定的不相符,提示错误。 如果源代码符合BNF规则,则继续进行词法分析、语法分析、语义分析等等,这里就不做过多介绍了,我会在后续文章中详细介绍的。

    1.7K240发布于 2018-04-02
  • 来自专栏ACM算法日常

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

    他参与研发了FORTRAN, ALGOL等语言,以及帮助创建了BNF范式,用于程序设计语言的语法。由于FORTRAN和BNF的贡献,他于1977年获得ACM图灵奖。 受逻辑学家埃米尔·波斯特(Emil Post)的启发,巴克斯写下了后来被称为BNF(巴克斯诺尔形式)的IAL的全部语法。这种形式主义使用形状元语言变量的规则来描述语言 :模式。 这个改进版的BNF随后被用于最终的ALGOL 60报告。图6显示了1960年会议上的一些ALGOL委员会成员。这份报告发表后,BNF变得更加广为人知。 由于他在普及BNF方面的努力,首字母缩略词最初被认为是指巴克斯范式,现在被称为巴克斯诺尔形式。 图6:1974年ACM编程语言历史的图片,显示了一些ALGOL委员会成员。 除了BNF,巴克斯在ALGOL开发过程中所做的贡献还不清楚。BNF仍然是ALGOL对计算机科学最重要的贡献之一。如今几乎所有编程语言的语法都是用这种形式描述的。

    2.1K20编辑于 2022-07-26
  • 来自专栏云微的一点分享

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

    我们可以借助一个叫“BNF”的数学工具。 BNF与上下文无关文法 Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述 BNF类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则。 BNF语法定义的语言是一个字符串集合,可以按照下述规则书写,这些规则叫做书写规范(产生式规则),例如一个四则运算表达式可以表示为: exp -> exp op exp | ( exp ) | number EBNF EBNF是基本巴科斯范式(BNF)元语法符号表示法的一种扩展,主要对BNF中常见的两种情况,即重复项和可选项添加了相应的语法规则,如用方括号" .... " 表示可选部分,用花括号"{ ...

    2.1K00发布于 2020-06-05
  • 来自专栏各类技术文章~

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

    前言 本文将会从上下文无关文法开始介绍,从使用 BNF 描述语法到理解递归下降分析思想,最后实现一个简单的 html 解析器收尾。 使用 BNF 描述一下 js 中的简单语法,例如 数组语法: js 中数组源代码为: [1] [1, 2, 3] [1, 2, 3, ] 复制代码 用 bnf 表示: 一个元素 ARRAY ::= "[ 下面使用 BNF 描述一下 html 语法(简略): 源代码:

    复制代码 bnf 表示: 最后 使用 BNF 描述语法,然后按照 BNF 编写 语法单元 parser,最后将 parser 组合起来成为完整的 parser,这就是 Parser Combinators。 应用价值: 在编写 BNF 的时候,可以更好的理解编程语言语法设计理念。有助于写出能够被编译器优化的语法。

    2K00发布于 2021-10-31
  • 来自专栏H2Cloud

    python的解释器spython介绍

    但是仍然没有找到很大头绪,后来我就在python.org上一顿逛,也下载了python的源码分析,源码目录有python的BNF描述文件,因为我已经看过一遍编译原理了,BNF就看的很懂,从头到尾读了一遍了以后 BNF就是完整的解析python语法的流程说明啊! 尝试解析,如果不满足这个BNF语法要求的就报错。 我为了生成跟这个BNF一致的代码结构,写了个python脚本解析这个BNF自动生成C++的解析函数。 Parser的实现   Parser的头文件是脚本解析BNF自动生成的。负责把scanner解析的token列表,按照BNF的规则构造成AST。

    1K50发布于 2018-03-09
  • 来自专栏云微的一点分享

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

    我们可以借助一个叫“BNF”的数学工具。 BNF与上下文无关文法 Backus-Naur符号(就是众所周知的BNF或Backus-Naur Form)是描述语言的形式化的数学方法,由John Backus (也许是Peter Naur)开发,最早用于描述 BNF类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则。 BNF语法定义的语言是一个字符串集合,可以按照下述规则书写,这些规则叫做书写规范(产生式规则),例如一个四则运算表达式可以表示为: exp -> exp op exp | ( exp ) | number EBNF EBNF是基本巴科斯范式(BNF)元语法符号表示法的一种扩展,主要对BNF中常见的两种情况,即重复项和可选项添加了相应的语法规则,如用方括号"[ … ]" 表示可选部分,用花括号"{ … }

    86120编辑于 2023-02-11
  • 来自专栏信数据得永生

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

    最常见的“语法的正则表达式”被称为 Backus–Naur Form(BNF),以创作者 John Backus 和 Peter Naur 命名。 BNF 描述了所需的记号,以及这些记号如何重复来形成语言的语法。BNF 还使用与正则表达式相同的符号,所以*,+和?有相似的含义。 对于这个练习,我将使用 https://tools.ietf.org/html/rfc5234 上面的 IETF 增强 BNF 语法,来规定上面的微型 Python 代码段的语法。 我使用 CAPITALS 的约定,在 BNF 中表示我会跳过的东西。 LPAREN 我假设我收到了一个def,但是现在我打算确保有一个(,所以我要匹配它。 params 在 BNF 中我将params定义为了新的“语法产生式”,或者“语法规则”。意思是在我的 Python 代码中,我需要一个新的函数。

    98420编辑于 2022-12-01
  • 来自专栏KAAAsS's Blog

    浅谈C语言中的类型声明

    范式 BNF范式 分析 优先级 总结 练习 One more thing… 后记 Reference 新年第一更! 如有机会,我可能会开个坑详细写一写2333 再进一步:BNF范式 之前我提出了外向内表内向外的阅读方法。 不过这个仅仅是简单的总结,所以这一小节让我们再进一步深究下去,来从C语言的BNF文法中理解类型声明的语法。 BNF范式 如果你对BNF范式有一定了解,请跳过这一段直接去看“分析”节。 巴科斯范式(英语:Backus Normal Form,缩写为 BNF),又称为巴科斯-诺尔范式(英语:Backus-Naur Form,缩写同样为 BNF,也译为巴科斯-瑙尔范式、巴克斯-诺尔范式), 优先级 从BNF范式中,我们可以看出指针声明和其他声明的优先级。其中,括号对优先级最高。其次,数组和函数指针的优先级相同,而指针的优先级最低。

    2.1K20编辑于 2022-01-14
  • 来自专栏编译原理

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

    2.2.2 文法的EBNF表示先说文法的BNF(巴克斯-诺尔范式),下面是一个BNF的例子EBNF为扩充的BNF表示,采用一些元符号来提高文法规则的表法能力。

    92510编辑于 2024-09-19
  • 来自专栏MasiMaro 的技术博文

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

    BNF范式与上下文无关文法 巴科斯范式 以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。 BNF表示语法规则的方式为:非终结符用尖括号括起。每条规则的左部是一个非终结符,右部是由非终结符和终结符组成的一个符号串,中间一般以“::=”分开。 使用BNF范式进行定义,可以写成 <取经团队>::=<唐僧><孙悟空><猪八戒><沙僧>。 相信到这里小伙伴应该明白BNF范式的一些基本概念和使用方式了。 我们再来插入一个题外话,既然这里提到BNF范式是一种上下文无关文法,那什么是上下文、什么是上下文无关。 代码编写 上面的定义只是开胃菜,希望通过上面的描述,小伙伴能够理解BNF范式的应用,至于上下文无关和上下文有关。这些暂时不用考虑,毕竟我们目前还是在做上下文无关文法相关的内容。

    78520编辑于 2023-03-24
  • 来自专栏木宛城主

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

    在编译原理领域,使用一个通用的表示方法来描述语法,这个方法就是上下文无关文法或BNF范式。 BNF范式构建 数学表达式的特点 运用编译原理的知识,编写一个自定义的解释器,我们需要如下三个步骤: BNF范式来描述游戏『公式』 词法分析器获得词法单元Token,对应的类是LexicalAnalyzer 算术表达式的BNF构建 通过对数学表达式的了解,我们知道一个数学表达式有数字、运算符等组成,并且运算符是左结合和有优先性,那怎样去构建它的BNF范式呢? 这个BNF范式的语法分析树为如下所示: ? 这个『公式』的语法往往是和上下文无关的,又被称为BNF范式。解释器的核心就是怎样构建一棵抽象的表达式树,这需要词法分析和语法分析的相关知识。

    2.5K100发布于 2018-03-28
  • 来自专栏山行AI

    javacc功能一览

    •JavaCC的允许扩展的BNF[5]规格-诸如(A)*,(A)+等-中的词汇和语法规格。扩展的BNF在某种程度上减轻了对左递归的需求。 实际上,A ::= y(x)*与相比,扩展BNF通常更容易阅读A ::= Ax|y。•词汇规范(例如正则表达式,字符串)和语法规范(BNF)都一起写在同一文件中。 8.更多详见BNF[8]说明 语法 PARSER_BEGIN(Example) /** Simple brace matcher. */ public class Example { /** Main /wiki/Left_recursion [4] 非终结: https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols [5] 扩展的BNF /en.wikipedia.org/wiki/Lexical_analysis [7] 类似Lex: https://en.wikipedia.org/wiki/Lex_(software) [8] BNF

    2.5K10发布于 2020-11-10
  • 来自专栏golang算法架构leetcode技术php

    thriftpy+ply源码分析

    那么yacc做的事情就是这一部分(实际应该说是BNF来做的)。 yacc会帮我们生成一个yyparse函数,这个函数会不断调用上面的yylex函数来得到token的类型。 他们在.y中定义,这些token既会被lex使用到,也会被.y文件中的BNF使用到。 写词汇分析代码。这部分代码在.l文件(就是lex的输入文件)中。这块的定义方式是:正则表达式-->对应操作。 写BNF。这些东西定义了语言的规约方式。 关于BNF 是一种context-free grammars,请参考:http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form 摘录: <symbol>

    88510编辑于 2022-08-02
  • 来自专栏全栈程序员必看

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

    像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。 BNF的元符号: ::=表示“定义为”,有的书上用–>|表示“或者”< >尖括号用于括起非终结符。 BNF的扩展EBNF: 可选项被括在元符号“[”和“]”中 重复项(零个或者多个)被括在元符号“{”和“}”中 仅一个字符的终结符用引号(“)引起来,以和元符号区别开来 上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述 BNF的扩展EBNF: 可选项被括在元符号“[”和“]”中 重复项(零个或者多个)被括在元符号“{”和“}”中 仅一个字符的终结符用引号(“)引起来,以和元符号区别开来 上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述

    1.4K20编辑于 2022-11-01
  • 来自专栏技术银河

    JavaScript 语言通识 — 重学 JavaScript

    BNF) 产生式:在计算机中指 Tiger 编译器将源程序经过词法分析(Lexical Analysis)和语法分析(Syntax Analysis)后得到的一系列符合文法规则(Backus-Naur Form,BNF)的语句 巴科斯诺尔范式:即巴科斯范式(英语:Backus Normal Form,缩写为 BNF)是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。 所以用 BNF 去描述这个远算的时候,首先我们会定义一个加法表达式,格式就是: 乘法表达式的列表 或 加法表达式 + 乘法表达式 或 加法表达式 - 乘法表达式 因为 BNF 是可以递归的,所以在定义表达式的时候 其他产生式 除了乔姆斯基谱系可以用 BNF 来定义,其实还有很多的不同的产生式的类型。比如说后来出现的 EBNF、ABNF,都是针对 BNF 的基础上做了语法上的扩张。 所以网上的产生式是五花八门的,只学一个 BNF 是无法读懂所有的语言的。虽然所他们都有不一样的标准和写法,但是它们所表达的意思大致上都是一样的。

    90731发布于 2020-10-29
  • 来自专栏玩转全栈

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

    语法定义通常使用BNF或EBNF表示。2.实现DSL的解析器:DSL解析器是将DSL代码解析为计算机可执行的指令的程序。解析器通常使用词法分析器和语法分析器来实现。 OK,立即这些,就看看其中的一些概念,对于新手可能需要科普一下:BNF或EBNF简单的描述BNF(巴克斯-诺尔范式)和 EBNF(扩展巴克斯-诺尔范式)是一种用于描述编程语言结构的形式语法。 例如,下面是一个使用BNF表示的简单数学表达式:<expr> ::= <term> | <expr> "+" <term> | <expr> "-" <term><term> ::= <factor> | <term> "*" <factor> | <term> "/" <factor><factor> ::= <number> | "(" <expr> ")"这个BNF描述了一个数学表达式可以由一个项 EBNF是BNF的一个扩展,添加了更多的元素来描述更复杂的语言结构。

    3.5K41编辑于 2023-03-12
  • 来自专栏腾讯技术工程官方号的专栏

    手写一个解析器

    BNF 来表示你的 DSL 语法 BNF 的全称是 Backus–Naur form,是一种表示上下文无关语法的表示方式,Nearley 的语法基于 BNF 的扩展 EBNF(Extended Backus–Naur 至此如何书写 BNF 就介绍完了,你可以已经发现了,正则表达式也可以用 BNF 来表示,事实上正则也是上下文无关的问题,自然也就可以用 BNF 来表示。 2. 生成 Parser 生成 Parser 会用到我们之前介绍到的 Nearley 框架,首先我们将上面给出的 BNF 语法定义保存到 grammar.ne 文件里。 react-excel-example.stackblitz.io/ 另外一个例子 为了加深理解,这里给出另外一个需求,将 MySQL 类似于 where 转换成云函数里面的 where 筛选的需求,给出 BNF

    1.5K41发布于 2020-05-27
  • 来自专栏phodal

    编程语言的 IDE 支持

    )生成中间代码 Jetbrins 基于 BNF 生成代码的方式:Grammar and Parser 自制 DSL 进行语法解析 Vim 基于正则 + 自制 DSL:Vim documentation: 我们也可以说 BNF 是一种编程语言无关的东西。但是,实际上在我们操作的时候,就会加入一些编程语言特定的要素。 语法分析器分析 由于先前编写系统分析工具 Coca 和通用语法分析器 Chapi ,我对于 BNF 的词法也是颇为上手的——实际上不难。 | IN SUB GT inputParameters | outputParameters 接着,在 IDEA 里面,我们可以通过这个 BNF 文件生成对应的 Lexer 文件和代码等。 不过呢,从两者的阅读体验对比来看,显然 BNF 会更加友好一点。 自制 DSL 语法解析 颇为遗憾的是,我尚未写过任何的 Vim 插件,好在我还知道 Vim 是如何退出来的。

    2.9K31发布于 2020-10-26
领券