博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
yacc/lex windows 下 Parser Generator 使用指南 - linux技术 动漫资源--林木100
阅读量:2400 次
发布时间:2019-05-10

本文共 4330 字,大约阅读时间需要 14 分钟。

导读:

关于yacc lex 和在下面链接的文章里已经有所介绍了
链接中的文章还介绍了在linux下如何使用yacc和lex工具,下面主要是介绍yacc和lex在windows下的用法。

以下内容属作者为xiaolin,请尊重作者的辛勤劳动,请勿转载。
yacc和lex在windows已经移植成功,其中常用的一个工具就是Parser Generator。这个工具使用yacc和lex能够生成Visual C++,Borland C++,Other C/C++以及相关Java代码。下面介绍一下这个工具是如何生成代码并使用Visual C++编译的。
注:关于Parser Generator的使用和配置,其实在Parser Generator Help中已经有很详细的介绍,感兴趣的朋友可以去那里查到更多有用的信息。
首先要去http://www.bumblebeesoftware.com/downloads.htm下载Parser Generator。
安装完毕后,我们可以在它的安装目录下找到一些例子以及编译程序所需的库文件和源文件,这些文件在编译是很重要。
单独yacc文件的编译。
以下是一个单独的yacc文件,实现一个简单的计算器功能。
%{
/************************************************************
www.linmu100.com
************************************************************/
#include
#include
#define YYSTYPE double /* double type for YACC stack */
%}
%token NUMBER
%%
lines    : lines expr '/n'            { printf("%g/n", $2); }
        | lines '/n'
        | /* e */
        | error '/n'                { yyerror("reenter last line:"); yyerrok(); }
        ;
expr    : expr '+' term                { $$ = $1 + $3; }
        | expr '-' term                { $$ = $1 - $3; }
        | term
        ;
term    : term '*' factor            { $$ = $1 * $3; }
        | term '/' factor            { $$ = $1 / $3; }
        | factor
        ;
factor    : '(' expr ')'                { $$ = $2; }
        | '(' expr error            { $$ = $2; yyerror("missing ')'"); yyerrok(); }
        | '-' factor                { $$ = -$2; }
        | NUMBER
        ;
%%
int main(void)
{
    return yyparse();
}
int yylex(void)
{
    int c;
    while ((c = getchar()) == ' ');
    if (c == '.' || isdigit(c)) {
        ungetc(c, stdin);
        scanf("%lf", &yylval);
        return NUMBER;
    }
    return c;
}
我们用Parser Generator的Project --> Parser Wizard创建一个工程,如下图所示,注意红圈部分的设置:
然后设置文件,模板:
其余按默认完成即可:
这时,我们可以看到
Parser Generator帮我们自动生成了一个myparser.y文件,语法规则就可以在这里加了。
现在我们把开头展示的yacc源码完全覆盖myparser.y文件,然后编译,成功后会生成三个文件:myparser.c,myparser.h,myparser.v
好,现在我们要做的就是用vc来编译myparser.c,myparser.h这两个文件了。
打开Microsoft Visual C++ 6.0,新建一个工程。
然后将
Parser Generator生成的两个文件myparser.c,myparser.h导入工程。(这里就不多说了^-^)
现在要设置环境变量了,首先要导入Parser Generator的库文件和源文件。在工具->选项里要设置这些环境变量。
设置完这些文件后,还要在工程->设置里添加yl.lib库:
好,一切设置完毕,开始编译,编译通过后,就会生成yacc_vc.exe文件。
假设有文件demo.txt,此文件和yacc_vc.exe在同一个目录,其内容如下:
1+3*5
3*4-23
7- 9 *30 - 999
此目录的命令行下运行如下命令:yacc_vc.exe
单独lex文件的编译。
以下是一个单独的lex文件,实现一个简单的计算单词个数功能。
%{
/************************************************************
www.linmu100.com
************************************************************/
int wc = 0;        /* word count */
%}
%%
[a-zA-Z]+    { wc++; }
/n|.        { /* gobble up */ }
%%
int main(void)
{
    int n = yylex();
    return n;
}
int yywrap(void)
{
    printf("word count: %d/n", wc);
    return 1;
}
我们用
Parser Generator新建一个工程:
下一步默认完成即可。 这时,Parser Generator帮我们自动生成了一个mylexer.l文件,词法规则可以在这里加。
同样的,我们用上面展示的lex文件内容完全覆盖mylexer.l文件,编译后同样生成三个文件,然后用VC编译其中的myparser.c,myparser.h这两个文件。
VC的设置方法和上面编译单独yacc文件时的步骤完全一样,最终会生成一个可以计算文件单词数目的.exe文件。
yacc 和 lex整合文件的编译。
以下分别是yacc文件和lex文件的内容,这两个文件共同实现了自定义的一个简单语法规则。
yacc文件内容:
%{
/*
www.linmu100.com
*/
#include
#include
void yyerror(const char *str)
{
    fprintf(stderr,"error: %s/n",str);
}
int yywrap()
{
    return 1;
}
main()
{
    yyparse();
}
char *heater="xl's test";
%}
%token TOKHEATER TOKHEAT TOKTARGET TOKTEMPERATURE
%union
{
    int number;
    char *string;
}
%token STATE
%token NUMBER
%token WORD
%%
commands:
    | commands command
    ;
command:
    heat_switch | target_set | heater_select
    ;
heat_switch:
    TOKHEAT STATE
    {
        if($2)
            printf("/tHeater '%s' turned on/n", heater);
        else
            printf("/tHeat '%s' turned off/n", heater);
    }
    ;
target_set:
    TOKTARGET TOKTEMPERATURE NUMBER
    {
        printf("/tHeater '%s' temperature set to %d/n",heater, $3);
    }
    ;
heater_select:
    TOKHEATER WORD
    {
        printf("/tSelected heater '%s'/n",$2);
        heater=$2;
    }
    ;
lex文件内容:
%{

/*
www.linmu100.com
*/
#include
#include
#include "myparser.h"                  //注意,这里的头文件要和
Parser Generator生成的头文件名一样。
extern char *yytext;
%}
%%
[0-9]+                  {yylval.number=atoi(yytext); return NUMBER;}
heater            return TOKHEATER;
heat                    return TOKHEAT;
on|off                  {yylval.number=!strcmp(yytext,"on"); return STATE;}
target                  return TOKTARGET;
temperature             return TOKTEMPERATURE;
[a-z0-9]+        {yylval.string=strdup(yytext);return WORD;}
/n                      /* ignore end of line */;
[ /t]+                  /* ignore whitespace */;
%%
现在用Parser Generator创建新的工程:
其余的步骤和上面编译yacc时的步骤相同,最终可以生成both_y_l.exe文件,放一个demo.txt和both_y_l.exe在同一个目录下,demo.txt内容如下:
heat on
target temperature 99
heater asdfsieiwef99adsf
然后在此目录的命令行下执行both_y_l.exe
以上即为 Parser Generator的使用以及如何用 VC编译
/
/*-----Lex & Yacc ---- ----*/
/
/*-----linux工具,Lex & Yacc,windows下操作----*/
/
/*-----linux配置,UNIX,开源软件,linux技术,makefile----*/
/
/*----------------------@xiaolin--------------------*/
/

本文转自
你可能感兴趣的文章
超市食品名称中英文对照(zt)
查看>>
第六章 预测与决策
查看>>
14大管理方法工具(zt)
查看>>
职业生涯规划与管理实操(zt)
查看>>
国贸、货代常用词汇(zt)
查看>>
人力资源术语英汉对照(zt)
查看>>
传说中的100句英语可以帮你背7000单词(zt)
查看>>
网管IT服务管理五个心得 (zt)
查看>>
沟通管理 让你的团队动起来(zt)
查看>>
循序渐进学SAP系列(一):--SAP该如何入门
查看>>
PMP考试经验谈(转载)
查看>>
緣分是找到包容你的人(转载)
查看>>
关注人力资源管理的十大变化(转)
查看>>
知识管理与业务流程重组(转载)
查看>>
世界经典广告词欣赏
查看>>
35岁前应该做好的十件事
查看>>
创业从小做起的十条忠告(转)
查看>>
妙语连珠94句
查看>>
机械制造企业内外供应链的整合(转载)
查看>>
笔记:ISO/IEC 2000与ITIL的区别与联系
查看>>