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

在lex中如何使yyin指向yacc中具有main函数的文件?

在Lex中,如果要将yyin指向具有main函数的文件,可以通过以下步骤实现:

  1. 在Lex文件中,定义一个变量yyin,用于存储文件指针。
  2. 在Lex文件中,使用fopen函数打开具有main函数的文件,并将文件指针赋值给yyin
  3. 在Lex文件中,使用yylex函数读取文件内容,并进行词法分析。
  4. 在Yacc文件中,定义一个规则,用于处理main函数。
  5. 在Yacc文件中,使用yyparse函数解析文件内容,并进行语法分析。

以下是一个简单的示例代码:

代码语言:c
复制
// Lex文件
%{
#include<stdio.h>
#include <stdlib.h>
#include "y.tab.h"
extern FILE *yyin;
%}

%%
"main" { return MAIN; }
%%

int main() {
    yyin = fopen("filename.c", "r");
    yylex();
    fclose(yyin);
    return 0;
}
代码语言:c
复制
// Yacc文件
%{
#include<stdio.h>
#include <stdlib.h>
int yylex();
void yyerror(char *s);
%}

%token MAIN

%%
program:
    | program main_func
    ;

main_func:
    MAIN { printf("Found main function!\n"); }
    ;

%%

int main() {
    yyparse();
    return 0;
}

void yyerror(char *s) {
    fprintf(stderr, "Error: %s\n", s);
}

在上面的示例代码中,Lex文件中定义了一个变量yyin,并使用fopen函数打开具有main函数的文件,并将文件指针赋值给yyin。Yacc文件中定义了一个规则,用于处理main函数。在main函数中,使用yyparse函数解析文件内容,并进行语法分析。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

YaccLex 快速入门(词法分析和语法分析)

高级 Lex 这一节我们将讨论 Lex 提供函数,这样你就能编写更加复杂程序了。 将它们全部结合起来 .lex文件Lex 扫描器。...详尽列表请参考 Lex 或 Flex 手册(见后文 资源)。 Lex 变量 yyin FILE* 类型。 它指向 lexer 正在解析的当前文件。 yyout FILE* 类型。...它指向记录 lexer 输出位置。 缺省情况下,yyin 和 yyout 都指向标准输入和输出。 yytext 匹配模式文本存储在这一变量(char*)。 yyleng 给出匹配模式长度。...方法是使用 yyin 文件指针(见上表)指向不同文件,直到所有的文件都被解析。 最后,yywrap() 可以返回 1 来表示解析结束。...(这一段是可选,如果有人想要略过它的话:)一个函数main() 调用 yyparse() 函数Yacc Lex yylex() 等效函数)。

5.1K20

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

expr: expr '-' expr | expr '*' expr | expr '<' expr | '(' expr ')' … ; 1.1 场景一:不同token如何决定计算先后顺序?...这时优先级相同,需要定义结合性方向,来决定是先reduce 1-2还是先reduce 2-5。 2 如何声明优先级与结合性?...优先级声明方式: 不同运算符相对优先级由声明它们顺序控制。文件第一个优先级/关联性声明声明优先级最低运算符,下一个此类声明声明优先级稍高运算符,依此类推。...3 局部提升优先级 有些符号优先级与上下文强绑定,例如负号 作为一元运算符时有很高优先级:-4 * 5 作为二元运算符时只有中等优先级:3 - 4 * 5 yacc or bison允许临时修改优先级...lex.yy.c [mingjie@x ~/proj/lex1]$ .

1.2K30

词法分析程序 LEX和VC6整合使用一个简单例子

所以这篇文章我们就来探讨一下如何使用这个工具。。。 工具准备: 我是用了VC6和flex.exe(这个程序可以WINDOWS下使用,下面还带了个BISON。...%d/n”, num_lines, num_chars ); } 主要还是中间部分比较重要,LEX参考文档里,是一种 pattern–action 对应,识别出来,要干吗就由你来定了,这里是: 1...上面写.l 文件也要和”lex.yy.c” 文件放在一起。。。...很简单,我们就改写一下”lex.yy.c” 文件main()函数,改成下面这样就好了(打开一个文件,把输入 yyin 指向文件句柄,yyin 和 yylex 都是lex生成固定变量和函数,还有一些...yyout什么,先自己看看哈): int main(int argc, char* argv[]) { FILE *f = fopen(“main.txt”, “r”); yyin = f; yylex

46020

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

,其实核心逻辑比较简单: 1、raw_parser作为高层入口 2、raw_parser初始化后,通过base_yyparse进入yacc框架 3、yacc框架调用base_yylex进入lex拿一个...lex框架定义,保存了解析所需 6、core_yylex是scan.l生成scan.c中提供函数,功能就是scan.l编写匹配规则 7、core_yylex可以自己scan.l自定义其他同参函数...,例如my_yylex,可以base_yylex替代core_yylex来使用 四、yacc工作原理、实例 总结: 1、整个语法树解析过程从叶子节点逐层向上构造,中间使用base_yylex获取新...lex函数一般不必深究内部调用流程,实际指向scan.c生成文件函数,代码可读性比较差,位置: scan.c /** The main scanner function which does...**FILE \*yyin:** **FILE \*yyout:** 这是Lex本身已定义输入和输出文件指针。这两个变量指明了lex生成词法分析器从哪里获得输入和输出到哪里。

52250

TiDB SQL Parser 实现

Lex & Yacc 分别是由贝尔实验室Mike Lesk 和 Stephen C. Johnson1975年发布。...SparkSQL解析就是使用了ANTLR。Lex & Yacc 相对显得有些古老,实现不是那么优雅,不过我们也不需要非常深入学习,只要能看懂语法定义文件,了解生成解析器是如何工作就够了。...从上面的流程可以看出,用户需要分别为Lex提供patterns定义,为 Yacc 提供语法规则文件Lex & Yacc 根据用户提供输入文件,生成符合他们需求词法分析器和语法分析器。...,大括号内动作会被执行:将整数值存储变量 yylval ,并返回 token 类型 INTEGER 给 Yacc。...至此,我们大致了解了Lex & Yacc原理。其实还有非常多细节,例如如何消除语法歧义,但我们目的是读懂TiDB代码,掌握这些概念已经够用了。

39110

thriftpy+ply源码分析

lex工具会帮我们生成一个yylex函数yacc通过调用这个函数来得知拿到token是什么类型,但是token类型是yacc定义。...yacc输入文件一般会被命名成 .y文件,通过yacc -d XX.y我们得到输出文件是y.tab.h y.tab.c,前者包含了lex需要token类型定义,需要被include进 .l文件....y文件这里动作都是用{}扩起来,用C语言来描述,这些代码可以做你任何想要做事情 C code Section main函数,yyerror函数定义 lexyacc能帮我们做什么?...使用lexyacc我们要做那几件事情? 定义各种token类型。他们.y定义,这些token既会被lex使用到,也会被.y文件BNF使用到。 写词汇分析代码。...这部分代码.l文件(就是lex输入文件。这块定义方式是:正则表达式-->对应操作。

64310

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

,了解解析器是如何工作,先要对 Lex & Yacc 有些了解。...Lex & Yacc 分别是由贝尔实验室 Mike Lesk 和 Stephen C. Johnson 1975 年发布。...Lex & Yacc 相对显得有些古老,实现不是那么优雅,不过我们也不需要非常深入学习,只要能看懂语法定义文件,了解生成解析器是如何工作就够了。...从上面的流程可以看出,用户需要分别为 Lex 提供 patterns 定义,为 Yacc 提供语法规则文件Lex & Yacc 根据用户提供输入文件,生成符合他们需求词法分析器和语法分析器。...至此,我们大致了解了 Lex & Yacc原理。其实还有非常多细节,例如如何消除语法歧义,但我们目的是读懂 TiDB 代码,掌握这些概念已经够用了。

4.5K100

Flex & Bison 开始

Knuth 所研究语法分析理论(因此 yacc 十分可靠)和方便输入语法。这使得 yacc Unix 用户中非常流行,尽管当时 Unix 所遵循受限版权使它只能够被使用在学术界和贝尔系统里。...他们发现 lex 既可以作为一个独立工具,也可以作为 Johnson yacc 协同程序。lex 因此变得十分流行,尽管它运行起来有一点慢并且有很多错误。...大概 1987 年,Lawrence Berkeley 实验室 Vern Paxson 把一种用 ratfor(当时流行一种扩展 Fortran 语言)写成 lex 版本改写为 C 语言,被称为...由于它比 AT&T lex 更快速和可靠,并且就像伯克利 yacc 那样基于伯克利许可证,它最终也超越了原来 lex。...范例指导了我们如何使用 Flex & Bison 开发一个计算器,并能支持变量、过程、循环和条件表达式,有内置函数,也支持用户自定义函数

1.4K20

【Python】Ply 简介

Ply 是一个纯 python 词法分析和语法分析库,包括两个模块:lexyacc Ply Ply 是一个纯 python 词法分析和语法分析库,包括两个模块:lexyacc lex 用于将输入文本通过正则表达式转换为一系列...: def t_NUMBER(t: lex.LexToken): r'\d+' t.value = int(t.value) return t 正则表达式函数文档字符串中指定...你可以单独模块定义规则,以此保证分析器主代码干净,这需要你创建 lexer 时显式地指定 module: lexer = lex.lex(module=tokrules) 面向对象:有时面向对象不失是一个封装好办法...这里一个漏洞是操作符不同上下文中可能有不同优先级,考虑 3 - 4 * -2 其中 - 在前面的用法优先级显然低于后面一个用法优先级,为了解决这个问题,可以设置虚拟 TOKEN: precedence...,要了解语法分析详细流程,你肯呢个需要阅读 parser.out 文件,该文件语法分析器第一次运行时被生成,描述了语法分析详细流程,文件内容其实很容易理解,你需要注意下面三点: 文件每个 state

2.5K30

CSS大会 | 打破常“规”:挖掘语法解析器规则漏洞

右边图是一个简单编译流程图,早期,编写编译器相当耗时,直到LexYACC诞生,有了它们,开发者只需要关注如何设计词法和语法规则,剩下解析器代码都由它们来生成处理,大大提高了程序编译解析器开发效率...我们议题重点关注Lex&YACC和LEMON Parser Generator。 Lex YACC解析器,生成解析器流程如右图所示。...三、如何人工挖掘语法规则漏洞 首先是LexYACC历史漏洞不多,但词法/语法规则是由开发者定义,虽然LexYACC代码不多,漏洞较少,但规则就好比我们开发插件,如果插件有问题,这个软件也存在安全风险...正如右图所示,黄色部分表示可能被攻击攻击面,分别对应四个处理程序(LexYACC,yylex,yyparse)。但在实际攻击场景,规则其实早已定义好,规则在程序相当于常量。...这个函数逻辑是添加主键时候,先检查要添加列是否是表已有的列; 如果是已存在列,则将其设置为主键。

95840

Postgresql使用Plpgsql编译SELECT INTO细节

select 列名1,列名2 into 变量1,变量2 这类调用形式代码执行细节分析记录。 总结速查 lex解析到into后,会进入函数把into后面的字符全部拿出来处理。...lex在看到变量1、变量2后,会去ns里面搜索名字,如果搜到了,返回token=T_DATUM,附带PLwdatum数据,指向plpgsql_Datums数组同名变量结构。...yacc拿到T_DATUM后开始处理PLwdatum,拿到plpgsql_Datums数组变量,如果变量类型是row或record则可以直接使用,如果是var则需要拼接into后面所有字符 到一个...PLpgSQL_row记录了变量名字 和 变量plpgsql_Datums数组位置。...lex返回T_WORD使yacc进入make_execsql_stmt分支 stmt_execsql : K_IMPORT { $$ = make_execsql_stmt(K_IMPORT

58610

借助yacclex自制计算器——《自制编程语言》一

执行语法分析程序称为解析器(parser),yacc就是能根据语法规则自动生成解析器程序 yacclexmac上已经预装。...一个算式输入后,接着输入换行符就会执行计算,因此这里换行符也应设置为记号     lex,使用正则表达式定义记号。...如果没有这个函数的话,就必须手动链接lex文件。 第12行到第27行是规则区块。这一部分是使用正则表达式*去描述记号。...yacc规则区块由语法规则以及C语言编写相应动作两部分构成。 语法规则     yacc,会使用类似BNF(巴克斯范式)规范来编写语法规则。...2.3 生成执行文件     mac下按顺序执行如下命令,就会输出名为mycalc执行文件 yacc -dv mycalc.y // 运行yacc lex mycalc.l // 运行

4.4K10

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

一、语法解析整体流程 语法解析封装函数比较多看起来不太容易理解,其实核心逻辑比较简单: 1、raw_parser作为高层入口 2、raw_parser初始化后,通过base_yyparse进入yacc...框架 3、yacc框架调用base_yylex进入lex拿一个token(正常用框架是每次拿一个,PG通过对lex函数封装可以拿后面多个,有些语法需要看到后面多个一块解析) 4、拿回来token...(2)如果有预读token就直接用了,不再重新解析 (3)如果没有预读token,调core_yylex从lex拿一个token出来,如果是普通token直接返回yacc继续reduce (4)...3、语法树最上层会把最终 reduce结果保存到parsetree作为最终结果。...lex函数一般不必深究内部调用流程,实际指向scan.c生成文件函数,代码可读性比较差,位置: scan.c /** The main scanner function which does

44220

Postgresql源码(50)语法解析时关键字判定原理(函数名不能使用关键字为例)

lex返回522后,yacc语法树没有匹配项了,返回错误。 [lex] NORMALIZE = 522 [yacc] if (!...core_yylex需要返回它遇到标识符类型并将其值存储yylval,这些标识符gram.y定义: gram.y %token ABORT_P ABSOLUTE_P ACCESS...这些标识符主要是给lex使用lex匹配到正则规则时,返回其中一个token。...但其实很多也不会触发冲突,为了使用这些关键字,gram.y文件后面专门定义了几组语法规则: unreserved_keyword:可以用于任意命名场景,如果新增关键字不会引发shift/reduce...增加方法:先确定新增关键字会不会造成语法冲突歧义等,加到上面5个list,然后根据能否用于表名、列名、as等场景,kwlist增加即可。

73830

javacc功能一览

自上而下解析器还有许多其他优点(除了更通用语法外),例如,调试起来更容易,能够解析到语法任何非终结[4]符,还可以向上传递值(属性)解析期间解析树向下移动。...•词汇规范(例如正则表达式,字符串)和语法规范(BNF)都一起写在同一文件。由于可以语法规范内联使用正则表达式,并且易于维护,因此它使语法更易于阅读。...•解析过程词汇规范定义为特殊标记标记将被忽略,但是这些标记可供工具处理。这一个有用应用是评论处理。...(Example.java:6) 如何在java IDE上进行javacc开发?...上运行main方法,Program arguments传入1+2,即会输出结果3.0。

1.9K10

【makefile】

模式规则,如果有多个目标,那么," $@ " 就是匹配于目标模式定义集合。 $% ——仅当目标是函数文件,表示规则目标成员名。...LEX Lex方法分析器程序(针对于C或Ratfor)。默认命令是“lex”。 PC Pascal语言编译程序。默认命令是“pc”。 YACC Yacc文法分析器(针对于C程序)。...YFLAGS Yacc文法分析器参数。 2.2隐含规则 GNU make 包含有一些内置或隐含规则,这些规则定义了如何从不同依赖文件建立特定类型目标。...后缀规则定义了将一个具有某个后缀文件 (例如,.c 文件)转换为具有另外一种后缀文件(例如,.o 文件方法。...2.4 Makefile函数 Makefile可以使用函数来处理变量,从而让命令或规则更为灵活和具有智能,函数调用,很像变量使用,也是以“$”来标识函数调用后,函数返回值可以当做变量来使用

1.9K00

(1)PHP内核 - 玩转php编译与执行

0x02 编译过程 整个编译过程是整个PHP代码范围从开始到结束,PHP里面没有main函数一说,直接从头编译到尾,其实从到开始到结尾已经算是main函数范围了,除了函数,类定义以外。...yyfill就是一个动态填充输入值接口,在这里表示不需要在分割过程动态分配输入值,即不要考虑扫描过程填充用来继续被分割值,因为获取文件内容时候,是一次性把文件全部内容映射到了内存。...&& bison 接下来就是yacc语法分析器,yacc对应功能函数php里面为zendparse(),这个函数其实预处理自动生成,在这个函数通过不断调用lex_scan返回token,根据定义语法规则动态生成抽象语法数...其中 表示使用token时候会进行类型转换,所有的token类型定义YYSTYPE,这个结构前面也说过了是一个联合体,yacc自动生成yyparse函数下,获取token对应内容会保留在...如果你真的想看看yacc内部扫描语法,不要去看经过bison预处理之后.c文件,同级目录下有一个.output后缀相同文件文件,里面描述了yacc里面的状态机是如何工作

1.8K10
领券