首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Postgresql源码分析

    YACC嵌入式规则

    测试用例在文章末尾 嵌入式用法 YACC语法分析只允许动作在规则的末端,例如: (其中{}内部为定义好的规则) expr: T_INT { $$ = $1; } | expr T_PLUS } | T_PLUS expr %prec UMINUS { $$ = $2; } | T_MINUS expr %prec UMINUS { $$ = -$2; } ; 但YACC thing: abcd | abcz; abcd: ‘A' 'B' { func(); } 'C' 'D' ; abcz: ‘A' 'B' 'C' 'Z' 原因是: 第一种情况下,yacc

    1.3K10编辑于 2023-01-05
  • 来自专栏Postgresql源码分析

    YACC移进规约冲突案例分析

    解析器需要一个look ahead token,来知道逗号是否跟在expr ID后面。

    1.8K30编辑于 2023-01-06
  • 来自专栏架构师成长之路

    Yacc 与 Lex 快速入门(词法分析和语法分析)

    注意: 如果扫描器是用 Yacc 开发的解析器的一部分,只需要进行第一步和第二步。 关于这一特殊问题的帮助请阅读 Yacc和 将 Lex 和 Yacc 结合起来部分。 下面我们来讨论 Yacc... Yacc Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。 编译 Yacc 生成的代码以及其他相关的源文件。 将目标文件链接到适当的可执行解析器库。 用 Yacc 编写语法 如同 Lex 一样, 一个 Yacc 程序也用双百分号分为三段。 关于 Yacc 变量的详细讨论,请参考 Yacc 手册(见 资源)。 和 Yacc的讨论到此为止。

    6.9K21编辑于 2022-04-14
  • 来自专栏Postgresql源码分析

    Postgresql源码(98)lex与yacc的定制交互方式

    www.cs.virginia.edu/~cr4bd/flex-manual/Code_002dLevel-And-API-Options.html#Code_002dLevel-And-API-Options 2 背景知识二:YACC %name-prefix lex and yacc中可以使用prefix指定内置函数、变量的前缀,实现一套代码中包含多套解析器。 所以yacc中调用的yylex函数实际是base_yylex。 但是lex提供的是core_yylex,yacc调用的是base_yylex,怎么找到core_yylex呢?看下一节。 below. https://www.gnu.org/software/bison/manual/bison.html#Multiple-Parsers 3 yylex与yyparse yyparse是yacc yylex是lex入口,yacc通过自定义base_yylex函数,在函数中调用core_yylex进入lex拿token和值。

    1.3K30编辑于 2023-02-02
  • 来自专栏Charlie's Road

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

    就是能根据语法规则自动生成解析器的程序 yacc和lex在mac上已经预装。 1.3 yacc:     yacc是自动生成语法分析器的工具,输入扩展名为.y的文件,就会输出语法分析器的C语言代码。 yacc的规则区块由语法规则以及C语言编写的相应动作两部分构成。 语法规则     在yacc中,会使用类似BNF(巴克斯范式)的规范来编写语法规则。 2.4 冲突     实际用yacc试做一下解析器,可能会被冲突(conflict)困扰。所谓冲突,就是遇到语法中模糊不清的地方时,yacc报出呃错误。     yacc运行时,遇到下面任意一种情况都会发生冲突。 同时可以进行多个归约。称为归约/归约冲突。 满足移进的规则,同时又满足归约的规则。称为移进/归约冲突 即便发生冲突,yacc仍会生成解析器。

    5.1K10发布于 2021-03-29
  • 来自专栏Postgresql源码分析

    理解YACC中符号的优先级和结合性

    3 局部提升优先级 有些符号的优先级与上下文强绑定,例如负号 作为一元运算符时有很高的优先级:-4 * 5 作为二元运算符时只有中等优先级:3 - 4 * 5 yacc or bison允许临时修改优先级

    1.6K30编辑于 2022-12-11
  • 来自专栏Postgresql源码分析

    Postgresql中yacc语法树冲突解决方法(shiftreduce conflicts)

    在文件中搜索conflict on token即可: yacc的两种冲突 reduce/reduce冲突:两条规则都可以规约当前token 实例:VARCHAR改规约哪个?发生冲突。

    2.7K30编辑于 2022-10-31
  • 来自专栏Postgresql源码分析

    YACC移进规约冲突案例分析(二)output中状态机转移步骤详解

    $default表示任何向前看lookahead的字符(•位置表示的字符)是什么都能匹配上后面的规则。

    1.1K10编辑于 2023-01-10
  • 来自专栏Postgresql源码分析

    不依赖yacc如何实现表达式按优先级解析

    总结 无意发现一个非常有意思的简单语法解析器,不依赖lex/yacc,本文对其中比较难理解的表达式解析(带优先级)部分做一些分析和记录。 (理解本文需要调试后面的代码部分,have fun!)

    40060编辑于 2023-10-13
  • 来自专栏云微的一点分享

    使用 lex + yacc 生成多种运算中缀表达式对应的计算器(代码实现)

    ); return NUMBER; } [^ \t\n] { return yytext[0]; } \n { return yytext[0]; } . {} %% yacc

    73150编辑于 2023-02-11
  • 来自专栏好奇心Log

    WRFChem的安装

    /configure --prefix=flex_directory make make install ubuntu apt安装 yacc和flex,ubuntu上使用flex和bison来代替lex 和yacc sudo apt-get install flex sudo apt-get install bison (3)NetCDF 和 Mpich2 请参考:WRF模式安装中的 NetCDF (需要先安装 设置环境变量 vi ~/.bashrc export WRF_CHEM=1 export WRF_KPP=1 export PATH=<yacc_dir>:$PATH export PATH=<flex_dir >/bin:$PATH export YACC='<yacc_dir>/yacc -d' export FLEX=<flex_dir>/bin/flex export FLEX_LIB_DIR=<flex_dir ='/usr/bin/<em>yacc</em> –d' #可选项,YACC c code compiler # FLEX_LIB_DIR和YACC根据实际路径改 二 安装 (1)configure步骤 .

    3.7K20发布于 2021-08-26
  • 来自专栏cloudskyme

    Ubuntu 10.4 下安装gSOAP安装过程和问题解决

    正在进入目录 `/home/titus/OpenComponent/gsoap-2.8/gsoap/src' /bin/bash http://www.cnblogs.com/ylwrap soapcpp2_yacc.y y.tab.c soapcpp2_yacc.c y.tab.h soapcpp2_yacc.h y.output soapcpp2_yacc.output -- yacc  -d -v http:// www.cnblogs.com/ylwrap: line 111: yacc:找不到命令 make[4]: *** [soapcpp2_yacc.c] 错误 1 原因: 没有安装:yacc(Yet Another

    1.5K80发布于 2018-03-20
  • 来自专栏golang算法架构leetcode技术php

    thriftpy+ply源码分析

    lex工具会帮我们生成一个yylex函数,yacc通过调用这个函数来得知拿到的token是什么类型的,但是token的类型是在yacc中定义的。 刚才说完lex了,那么yacc呢,教科书上把yacc做的工作叫做syntactic analysis。这次我们翻译没有直译做句法分析,而是叫语法分析,这个翻译能好一点,意思也基本上比较清楚。 那么yacc做的事情就是这一部分(实际应该说是BNF来做的)。 yacc会帮我们生成一个yyparse函数,这个函数会不断调用上面的yylex函数来得到token的类型。 如果我们想实自定义一个简单的语言(比如SQL)来实现操作,这个时候就可以用lex和yacc。 lex和yacc 做的事情只是:用C语言来实现另外一种语言。 如果和yacc一起来使用的话,对应的操作通常是返回一个token类型,这个token的类型要在yacc中提前定义好。 写BNF。这些东西定义了语言的规约方式。

    88210编辑于 2022-08-02
  • 来自专栏GoCoding

    Flex & Bison 开始

    起源 bison 来源于 yacc,一个由 Stephen C. Johnson 于 1975 年到 1978 年期间在贝尔实验室完成的语法分析器生成程序。 Knuth 所研究的语法分析理论(因此 yacc 十分可靠)和方便的输入语法。这使得 yacc 在 Unix 用户中非常流行,尽管当时 Unix 所遵循的受限版权使它只能够被使用在学术界和贝尔系统里。 大约在 1985 年,Bob Corbett,一个加州伯克利大学的研究生,使用改进的内部算法再次实现了 yacc 并演变成为伯克利 yacc。 由于这个版本比贝尔实验室的 yacc 更快并且使用了灵活的伯克利许可证,它很快成为最流行的 yacc。 由于它比 AT&T 的 lex 更快速和可靠,并且就像伯克利的 yacc 那样基于伯克利许可证,它最终也超越了原来的 lex。

    2.1K20编辑于 2022-11-07
  • 来自专栏iOSDevLog

    Linux From Scratch

    root 9 9月 3 10:50 /bin/sh -> /bin/bash Binutils-2.25 (比 2.35 更新的版本未经测试,不推荐使用) Bison-2.7 (/usr/bin/yacc 必须是到 bison 的链接,或者是一个执行 bison 的小脚本) Bison-2.7 (/usr/bin/yacc 必须是到 bison 的链接,或者是一个执行 bison 的小脚本) Coreutils ]; then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`"; elif [ -x /usr/bin/yacc ]; then echo yacc is `/usr/bin/yacc --version | head -n1` else echo "yacc not found" fi bzip2 --version 2>&1 -> /usr/bin/bison.yacc bzip2, Version 1.0.8, 13-Jul-2019.

    2.5K30发布于 2020-09-27
  • 来自专栏Postgresql源码分析

    Postgresql源码(96)操作符的语法解析细节

    单字符Operators 1 加法 select 1+2; 3 解析过程 steps lex yacc规则左值 yacc规则右值 gram.y规则代码 1 SELECT 623 2 ICONST (ResTarget); … 16 target_list target_el $$ = list_make1($1) 2 绝对值 select @ -5.0; 5 解析过程 steps lex yacc 规则左值 yacc规则右值 gram.y规则代码 1 SELECT 623 2 Op 265 3 qual_Op Op $$ = list_make1(makeString($1)) 4 {decinteger}))`←decinteger 3 取反 select -(-5.0); 5 解析过程 steps lex yacc规则左值 yacc规则右值 gram.y规则代码 1 SELECT +-*/%<>=] {…return Op;} 2 逻辑 空格不能少 select true and false; f 解析过程 steps lex yacc规则左值 yacc规则右值 gram.y规则代码

    71320编辑于 2022-12-31
  • 来自专栏猫头虎博客专区

    2014年12月22日 Go生态洞察:Go语言中的代码生成

    工具和示例 Yacc:读取语法描述并输出解析该语法的程序。 Protocol Buffer编译器:读取接口描述并输出结构定义、方法等支持代码。 使用go generate 例如,使用Go的Yacc工具生成Yacc语法: 安装Go的Yacc工具: go get golang.org/x/tools/cmd/goyacc 假设有一个名为gopher.y 的Yacc输入文件,定义了新语言的语法。 Yacc.

    23810编辑于 2024-04-09
  • 来自专栏韩曙亮的移动开发专栏

    【错误记录】编译 Linux 内核报错 ( /bin/sh: 1: bison: not found )

    报如下错误 : root@ubuntu:~/kernel/linux-5.6.14# make menuconfig LEX scripts/kconfig/lexer.lex.c YACC Setting up bison (2:3.0.4.dfsg-1) ... update-alternatives: using /usr/bin/bison.yacc to provide /usr/ bin/yacc (yacc) in auto mode root@ubuntu:~/kernel/linux-5.6.14#

    3.1K30编辑于 2023-03-30
  • 来自专栏mazhen.tech

    TiDB SQL Parser 的实现

    的Golang版,所以要想看懂语法规则定义文件parser.y,了解解析器是如何工作的,先要对Lex & Yacc有些了解。 Lex & Yacc 介绍 Lex & Yacc 是用来生成词法分析器和语法分析器的工具,它们的出现简化了编译器的编写。 Lex & Yacc 分别是由贝尔实验室的Mike Lesk 和 Stephen C. Johnson在1975年发布。 从上面的流程可以看出,用户需要分别为Lex提供patterns的定义,为 Yacc 提供语法规则文件,Lex & Yacc 根据用户提供的输入文件,生成符合他们需求的词法分析器和语法分析器。 goyacc 简介 goyacc 是golang版的 Yacc。和 Yacc的功能一样,goyacc 根据输入的语法规则文件,生成该语法规则的go语言版解析器。

    1.3K10编辑于 2023-11-24
  • 来自专栏腾讯技术工程官方号的专栏

    编译原理初学者入门指南

    你可以选择自己编写 lexer 和 parser,也可以选择通过定义 yacc 文件的方式让工具自动生成。 3.2 使用 goyacc 的思路 yacc 类工具的共同特点就是,通过编写 .y 格式的说明文件定义语法,然后使用 yacc 命令行工具生成对应语言的源代码。 而 yacc 只包含定义文法的语法,不含各类编程语言的语法,所以聪明的你肯定能猜到,yacc 文件中免不了会出现类似宏定义的东西,会直接嵌入各类编程语言的代码片段。 yacc 实现 parser,最少需要知道的就是前面四种描述符。 3.5 参考工程 goyacc 的示例工程不多,不推荐用 yacc 实现计算器的例子,参考性比较差。

    2.7K21发布于 2021-01-21
领券