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

借助yacc和lex自制计算器——《自制编程语言》一

执行语法分析的程序称为解析器(parser),yacc就是能根据语法规则自动生成解析器的程序 yacc和lex在mac上已经预装。...2.试做一个计算器 mycalc的实际运行效果如下(%是命令提示符): image.png 2.1 为mycalc所编写的输入文件mycalc.l如下(用lex解析): image.png 第...: image.png image.png y.tab.c中包含yacc生成的语法分析器的代码,lex.yy.c是词法分析器的代码。...y.tan.h是为了将mycalc.y中定义的记号及联合体(union)传递给lex.yy.c。 2.4 冲突     实际用yacc试做一下解析器,可能会被冲突(conflict)困扰。...后续会不借助jacc和lex重新制作一个计算器。本文结束。 本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议 ----

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

    编译入门 - 从零实现中文计算器

    Lex / Yacc lex是一个产生词法分析器(lexical analyzer,"扫描仪"(scanners)或者"lexers")的程序,Lex是许多UNIX系统的标准词法分析器产生程序。...Lex 常常与 yacc 语法分析器产生程序一起使用。 yacc(Yet Another Compiler Compiler),是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。...yacc生成的编译器主要是用C语言写成的语法解析器,需要与词法解析器Lex一起使用,再把两部分产生出来的C程序一并编译。...GNU bison基本兼容Yacc,并做了一些改进。它一般与flex一起使用。 上面介绍了几个有名的工具,这些工具在其他语言中都有对应的类库,比如 JS 中的 bison 叫 jison。...这个中文计算器和普通的计算器非常相似,只是不使用 0123456789 而是 零壹贰叁肆伍陆柒捌玖拾佰仟万亿,不使用 +-*/(),而是 加 减 乘 除 左括号 右括号。

    78510

    Flex & Bison 开始

    [2] parser/gram.y[3] 在编译器结构中,词法分析器、语法分析器是编译器前端的主要组成部分。...Knuth 所研究的语法分析理论(因此 yacc 十分可靠)和方便的输入语法。这使得 yacc 在 Unix 用户中非常流行,尽管当时 Unix 所遵循的受限版权使它只能够被使用在学术界和贝尔系统里。...他们发现 lex 既可以作为一个独立的工具,也可以作为 Johnson 的 yacc 的协同程序。lex 因此变得十分流行,尽管它运行起来有一点慢并且有很多错误。...由于它比 AT&T 的 lex 更快速和可靠,并且就像伯克利的 yacc 那样基于伯克利许可证,它最终也超越了原来的 lex。...范例指导了我们如何使用 Flex & Bison 开发一个计算器,并能支持变量、过程、循环和条件表达式,有内置函数,也支持用户自定义函数。

    1.6K20

    自制计算器——《自制编程语言》二

    自制计算器——《自制编程语言》二 ? CharlieWang发布于 4 月 7 日 前面介绍了借助yacc和lex自制计算器。...《自制计算器(借助yacc和lex)—《自制编程语言》一》 本文介绍下不用yacc和lex的实现过程,其实就是自己编写词法解析器和词法分析器来代替yacc和lex。...2.本次的计算器是以行尾单位的,st_line会保存一行中的所有信息,但在当下的编程语言中,换行一般和空白字符是等效的,因此不应该以行尾单位处理,而是从文件中逐字符(getc()等函数)读入解析会更好。...yacc版本的计算器使用下面的语法规则: expression /* 表达式的规则 */ : term /* 和项 */...- 本篇完 下一篇将让本文的计算器支持括号和负数。

    1.6K20

    【Python】Ply 简介

    Ply 是一个纯 python 的词法分析和语法分析库,包括两个模块:lex 和 yacc Ply Ply 是一个纯 python 的词法分析和语法分析库,包括两个模块:lex 和 yacc lex 用于将输入的文本通过正则表达式转换为一系列...Token yacc 用作上下文无关语法分析 lex 词法分析 使用 lex 词法分析最重要的是定义 token 及其解析规则,每个词法分析程序都必须定义 tokens 元组用于声明 TOKEN: tokens...return t 需要注意的是 tokens 列表中的 TOKEN 是有顺序的,靠前的 TOKEN 将优先被解析,如在定义 = 和 == 的时候,你可能就需要将后者放在前面。...你可以在单独的模块中定义规则,以此保证分析器主代码干净,这需要你在创建 lexer 时显式地指定 module: lexer = lex.lex(module=tokrules) 面向对象:有时面向对象不失是一个封装的好办法...index = p.lexpos(2) 后记 关于更详细的 ply 的用法参见官方文档,推荐一篇文章 最后附上上面例子中一个简单计算器的完整程序: import ply.lex as lex

    2.8K30

    thriftpy+ply源码分析

    lex工具会帮我们生成一个yylex函数,yacc通过调用这个函数来得知拿到的token是什么类型的,但是token的类型是在yacc中定义的。...yacc的输入文件一般会被命名成 .y文件,通过yacc -d XX.y我们得到的输出文件是y.tab.h y.tab.c,前者包含了lex需要的token类型定义,需要被include进 .l文件中...其实任何计算机能做的事情都可以用C语言来实现,lex和yacc存在的意义在于简化语言,让使用者能够以一种用比较简单的语言来实现复杂的操作。...lex和yacc 做的事情只是:用C语言来实现另外一种语言。所以,他没办法实现C语言自己,但是可以实现java、python等。...使用lex和yacc我们要做那几件事情? 定义各种token类型。他们在.y中定义,这些token既会被lex使用到,也会被.y文件中的BNF使用到。 写词汇分析代码。

    67310

    Mac下利用Flex和Bison实现控制台计算器

    简介 我们借助Flex和Bison对给定的表达式进行词法和语法分析,并在语法分析的同时完成相应的计算。...用 Flex 和 Bison 实现一个功能更为强大的计算器,包含以下运算: a) 加、减、乘、除运算 b) 乘方、开方运算 c) 位运算– 与 & 、或 |、非 ~ d) 阶乘运算 !...e)三角运算sin cos tan Lex和Yacc是unix系统上面的词法和语法分析的自动化处理工具,http://dinosaur.compilertools.net/上有对两者详细的介绍。...随后下载完毕,查看Xcode Command Line Tools中的程序,可以看到存在bison和flex两个文件。 ? 接下来就可以进行计算器的编写。 查看bison的信息: ? ?...json2tdata_lex这个函数是flex生成的。 json2tdata_error是用来处理错误信息的函数。 通过定义和实现这个函数你可以把错误信息写到任何地方。

    1.8K30

    编译原理初学者入门指南

    也就是我们在此次需求中需要获得的东西。 三、工程实践 我们的案例是使用 golang 来编写 lexer 和 parser。 在工程上,不同语言的实践方式是不一样的。...在 goyacc 中,lexer 本身相对简单,自己编写 go 代码实现就够了,parser 部分所需的文法约定,需要我们编写 .y 文件,也就需要了解 yacc 的文法约定。...Lex 函数的返回值类型(即词法分析器的实际产物)需要在后面的 yacc 文件的 token 部分定义。...而 yacc 只包含定义文法的语法,不含各类编程语言的语法,所以聪明的你肯定能猜到,yacc 文件中免不了会出现类似宏定义的东西,会直接嵌入各类编程语言的代码片段。...一开始我们只实现最简单的语法规则,后面自己就会逐渐了解更高级的文法规则了。 3.5 参考工程 goyacc 的示例工程不多,不推荐用 yacc 实现计算器的例子,参考性比较差。

    2.4K21

    TiDB SQL Parser 的实现

    Lex & Yacc 介绍 Lex & Yacc 是用来生成词法分析器和语法分析器的工具,它们的出现简化了编译器的编写。...Lex & Yacc 分别是由贝尔实验室的Mike Lesk 和 Stephen C. Johnson在1975年发布。...我们可以从一个简单的例子开始: 上图描述了使用Lex & Yacc构建编译器的流程。Lex根据用户定义的patterns生成词法分析器。...从上面的流程可以看出,用户需要分别为Lex提供patterns的定义,为 Yacc 提供语法规则文件,Lex & Yacc 根据用户提供的输入文件,生成符合他们需求的词法分析器和语法分析器。...goyacc 简介 goyacc 是golang版的 Yacc。和 Yacc的功能一样,goyacc 根据输入的语法规则文件,生成该语法规则的go语言版解析器。

    61110

    【Python神器】使用lex进行规则解释

    使用lex进行解释 ---- 同事们好像觉得这个功能实现很难,没什么信心,其实只要理解其中的逻辑,并不复杂,就算不借助工具也能实现,单单用正则和循环也能解决。...不过,使用神器lex显然是更好的解决方案(lex经常和yacc搭配使用,不过我们的需求比较简单,并不需要用到yacc)。...下面是一个简单的示例: import ply.lex as lex # List of token names. tokens = ( 'KEYWORD', # 关键词 'LPAREN...lex与yacc ---- 有了这两个神器,想实现一门简单的语言也是不难的。而且,理解了这两个工具,非常有助于理解编程语言本身,可谓大有益处。 程序员还是要保持好奇心。...备注: ply是Python Lex Yacc的缩写,官方文档:http://www.dabeaz.com/ply/ply.html

    1.3K10

    goyacc 实战

    token 的过程,这个过程一般比较简单,可以使用 lex, flex 之类的工具,也可以完全手写 语法解析时将 token 组合解析成语法树的过程,对于比较复杂的 dsl 设计,这个过程可能比较复杂...,可以借助如 yacc 这样的工具,但是为了追求效率,也可以完全手写(promql 就是手写,如果是手写,没有太大必要把词解析和语法解析两者分割得太清楚) 执行我们只看即时执行的情况,一般来说可以对上一步的语法树直接执行...解释的过程和和解释前后都可以嵌入自己的代码逻辑,完成一个程序或者单纯生成一个自定义的语法树结构. type yyLexer interface { Lex(lval *yySymType) int /...动作描述可以没有,写成 {} 或者不写, 动作描述由 golang 表示,一般会取动作描述中的元素作为参数使用 $1, $2 这样的形式表示第一个,第二个符号,符号的类型在 union 中已经定义。...,目的是优化和执行代码。

    5.3K60

    TiDB 源码阅读系列文章(五)TiDB SQL Parser 的实现

    Lex & Yacc 介绍 Lex & Yacc 是用来生成词法分析器和语法分析器的工具,它们的出现简化了编译器的编写。...Lex & Yacc 分别是由贝尔实验室的 Mike Lesk 和 Stephen C. Johnson 在 1975 年发布。...我们可以从一个简单的例子开始: [1240] 上图描述了使用 Lex & Yacc 构建编译器的流程。Lex 根据用户定义的 patterns 生成词法分析器。...从上面的流程可以看出,用户需要分别为 Lex 提供 patterns 的定义,为 Yacc 提供语法规则文件,Lex & Yacc 根据用户提供的输入文件,生成符合他们需求的词法分析器和语法分析器。...goyacc 简介 goyacc 是 golang 版的 Yacc。和 Yacc 的功能一样,goyacc 根据输入的语法规则文件,生成该语法规则的 go 语言版解析器。

    4.6K100

    javacc功能一览

    1.编译原理中常见的解析器LL和LR的对比;2.javacc的特征;3.如何在java ide中进行javacc的开发;4.通过演示一个javacc计算器的例子让你对javacc有更多了解(只是一个简单地演示...•JavaCC的允许扩展的BNF[5]规格-诸如(A)*,(A)+等-中的词汇和语法规格。扩展的BNF在某种程度上减轻了对左递归的需求。...•词汇规范(例如正则表达式,字符串)和语法规范(BNF)都一起写在同一文件中。由于可以在语法规范中内联使用正则表达式,并且易于维护,因此它使语法更易于阅读。...这有助于描述语言元素,例如允许某些Unicode字符(非ASCII)但不允许其他Unicode字符的Java标识符。•JavaCC提供类似Lex[7]的词法状态和词法动作功能。...在JavaCC中是优于其他工具的具体方面是它提供的概念,如一流的状态TOKEN,MORE,SKIP和状态的变化。这样可以提供更整洁的规范以及来自JavaCC的更好的错误和警告消息。

    2K10

    xmake v2.2.7 发布, 改进Cuda项目构建

    这个版本主要对Cuda项目的构建做了很多的改进,并且新增了对lex/yacc编译支持,同时也对target新增了on_link, before_link和after_link等链接阶段的定制化支持。...而在新版本中,xmake对其进行了支持,现在已经可以很好的在不同平台下,处理依赖关系了,这对日常编译和开发效率也会有不少的提升。...Lex/Yacc编译支持 当前xmake已经可以原生支持lex/flex, yacc/bison等对.l/.y文件的编译处理,来快速开发一些跟编译器相关的项目。...我们只需要添加lex,yacc两个规则到target中,使其可以正常处理.l/.y文件,当然.ll/.yy也是支持的。...添加命令行tab自动完成支持 为rule/target添加on_link,before_link和after_link阶段自定义脚本支持 #190: 添加add_rules("lex", "yacc"

    64320

    Postgresql源码(44)server端语法解析流程分析

    ,其实核心逻辑比较简单: 1、raw_parser作为高层入口 2、raw_parser初始化后,通过base_yyparse进入yacc框架 3、yacc框架中调用base_yylex进入lex拿一个...(2)如果有预读的token就直接用了,不再重新解析 (3)如果没有预读的token,调core_yylex从lex拿一个token出来,如果是普通token直接返回yacc继续reduce (4)...lex框架定义的,保存了解析所需 6、core_yylex是scan.l生成scan.c中提供的函数,功能就是scan.l中编写的匹配规则 7、core_yylex可以自己在scan.l中自定义其他同参函数...**FILE \*yyin:** **FILE \*yyout:** 这是Lex中本身已定义的输入和输出文件指针。这两个变量指明了lex生成的词法分析器从哪里获得输入和输出到哪里。...:**当前词法单元的长度 **yylineno** 提供当前的行数信息 **ECHO:**Lex中预定义的宏,可以出现在动作中,相当于`fprintf(yyout, “%s”,yytext)`,即输出当前匹配的词法单元

    59950
    领券