linux 下怎样安装使用 Yacc 和 Lex

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 下怎样安装使用 Yacc 和 Lex相关的知识,希望对你有一定的参考价值。

yacc/lex在linux下的使用指南

链接:http://blog.csdn.net/ruglcc/article/details/7817619

Lex 和 Yacc 是 Unix 和Linux 下词法和语法的分析,解析工具,有了这两个工具,你可以自己制作想要的编译器,也可以重新制作已有程序语言的解析器。需要注意的是linux下的这两个工具生成的程序源码只能是C和C++语言,当然现在早已有类似可以生成Java源码的语法分析器,如较常用的JavaCC(Java Compiler Compiler),相关内容可以去网上搜索。Lex和Yacc已被移植到windows下,现在常用的工具有Parser Generator。本文只介绍Linux 下Lex和Yacc的使用方法。

Lex介绍

Lex 通过对.lex或.l文件定义的格式生成一个C语言源码文件,通过编译这个源码,就生成了.lex文件或.l文件定义的编译器。.lex或.l文件的格式分三段:

1.全局变量声明部分
2.词法规则部分
3.函数定义部分

以下是一个简单的例子:lex_example.l文件

% //全局声明部分
/*林木100 linux
www.linmu100.com
*/
#include

extern char *yytext;
extern FILE *yyin;
int sem_count = 0;

%

//规则定义部分,
%%
[a-zA-Z][a-zA-Z0-9]* printf("WORD[%s] ", yytext);
[a-zA-Z0-9\/.-]+ printf("FILENAME ");
\" printf("QUOTE ");
\ printf("OBRACE ");
\ printf("EBRACE ");
; sem_count++; printf("SEMICOLON ");
\n printf("\n");
[ \t]+ /* ignore whitespace */;
%%

//以下为函数定义部分
int main(int avgs, char *avgr[])

yyin = fopen(avgr[1], "r");
if (!yyin)

return 0;

yylex();
printf("sem_count : %d\n", sem_count);
fclose(yyin);

return 1;
参考技术A 这里有window的
http://www.54programmer.com/article/28/7.html
《flex与bison 中文版 第二版》 http://www.54programmer.com/article/28/6.html

没有动态内存分配的 Lex 和 Yacc

【中文标题】没有动态内存分配的 Lex 和 Yacc【英文标题】:Lex and Yacc without Dynamic Memory Allocation 【发布时间】:2011-06-06 15:25:46 【问题描述】:

我正在设计软件以在禁止使用动态内存的嵌入式环境中运行。 Lex 和 Yacc 非常适合该应用程序。

我可以将 Lex 和 Yacc 配置为根本不使用动态内存分配吗?

我能否将 Lex 和 Yacc 配置为使用预定义的内存块,从而将动态内存使用限制在该预定义空间?

我能否将动态内存的使用限制为仅用于程序初始化(即程序首次运行时)?

编辑: 作为对 TonyK 的回应,我希望解析器不使用动态内存。

谢谢

【问题讨论】:

您是否考虑过在您自己的malloc 实现中进行链接? 【参考方案1】:

当然可以,如果您可以自己编译 Lex 和 Yacc。您只需要实现自己的 malloc 和 free,并链接到它们。 (假设 Lex 和 Yacc 是纯 C,我认为是这样。)

编辑我是否又误解了另一个问题?您希望 Lex 和 Yacc 自己使用有限的内存,还是希望它们生成使用有限内存的解析器?

【讨论】:

我希望解析器不使用动态内存。【参考方案2】:

不确定您是否可以这样做 - 如果这些工具生成的 C 想要进行动态分配,那么您将很难阻止它们。也许最好的办法是创建自己的分配系统,使用要允许的保留内存。

【讨论】:

【参考方案3】:

您可以使用 noyyalloc、noyyfree 和 noyyrealloc,然后自己实现这些。

【讨论】:

这并不能解决问题。 OP 被禁止使用动态内存分配。实现自己的动态内存分配不符合规则的精神。

以上是关于linux 下怎样安装使用 Yacc 和 Lex的主要内容,如果未能解决你的问题,请参考以下文章

Lex/Yacc 初识Lex

lex yacc flex bison

没有动态内存分配的 Lex 和 Yacc

在 Windows、Visual C++ 2008 上安装 LEX/YACC 或 flex/bison

Lex/Yacc Lex结合Yacc

Lex/Yacc Lex结合Yacc