lex和yacc环境配置
来源:互联网 发布:网络教育怎么样 编辑:程序博客网 时间:2024/06/07 18:22
lex和yacc的使用很简单,但环境配置却是各种问题,本章说明lex和yacc在windows下的环境配置。
软件需求:
系统 win7-64位(win7-32, win8, win10全部通过)
c++编译器: vs2010(2008,2013,2015也全部通过)
lex和yacc编译器: ParGen.exe
基本流程:
安装Pargen.exe,采用的默认目录安装在C:\Program Files (x86)\Parser Generator 2\
安装vs2010,这个各种教程,不再赘述
启动Pargen程序,并选择Project->ParserWizard…
选中ParserWizard,开始工程的创建,此处我创建功能,命名为Test,目录位置可自己选择,目标语言为C++,编译器为vc++(32-bit)
下一步,选择是创建lex,还是yacc,还是两者兼有。此处我选择是lex和yacc都有,准备实现一个不支持变量的计算器,使用lex识别token,使用yacc识别语法。
下一步,设置yacc的文件名字以及使用的解析器,此处我使用的默认选项,不进行修改,文件名默认为myparser.y
下一步,设置lex的文件名以及使用的分析器的名字,此处我使用的默认选项,文件名默认为mylexer.l
点击完成按钮,创建工程完毕,同时有两个文件mylexer.l 和myparser.y
工程的管理,可使用window->project菜单,查看工程下的所有文件
当你点击文件编辑窗口的放大按钮,会将其他的文件编辑覆盖,此时可以使用window->project菜单查看,也可以使用window->Tile vertically查看全部文件的平铺
编辑mylexer.l文件,粘贴入以下内容:
%{//this code will be added into the header of generated .cpp file#include <iostream>#include "myparser.h"using namespace std;//already defined in yacc.y, use %token...//enum{LT, EQ, GT, IF, ELSE, ID, NUMBER, PLUS, MINUS, TIMES, OVER, INT, DOUBLE,CHAR, LP,RP};const char* tokenStr[] = {"LT", "EQ", "GT", "IF", "ELSE", "ID", "NUMBER", "PLUS", "MINUS", "TIMES", "OVER", "INT", "DOUBLE","CHAR"};static void print_token(int token, char* lex);%}%name mylexerdelim [ \t]ws {delim}+letter [a-zA-Z]digit [0-9]id {letter}({letter}|{digit})*/* can support 12.34 */number {digit}+(\.{digit}+)?%%%{//this code will be added into yyaction function YYSTYPE YYFAR& yylval = *(YYSTYPE YYFAR*)yyparserptr->yylvalptr; //double yylval;%}{ws} {/* do nothing */}"int" {print_token(INT, yytext); return INT;}"double" {print_token(DOUBLE, yytext);}"char" {print_token(CHAR, yytext);}"+" {print_token(PLUS, yytext); return PLUS;}"-" {print_token(MINUS, yytext); return MINUS;}"*" {print_token(TIMES, yytext); return TIMES;}"/" {print_token(OVER, yytext); return OVER;}"(" {return LP;}")" {return RP;}"\n" {return EOL;}{id} { return ID;}{number} { yylval = atof(yytext);return NUMBER;}"//".* {return COMMENT;}"." {printf("Mystery character %s\n", yytext); }%%static void print_token(int token, char* lex){#ifdef LEX_DEUB cout<<"token:" << token<<" "<<"lex:"<<lex<<endl;#endif}
编译myparser.y文件,粘贴入以下内容
%{#include "mylexer.h"%}%name myparser// class definition{ // place any extra class members here}// constructor{ // place any extra initialisation code here}// destructor{ // place any extra cleanup code here}// place any declarations here%include {#ifndef YYSTYPE#define YYSTYPE double#endif}%token NUMBER ID%token PLUS MINUS TIMES OVER%token LP RP EOL COMMENT%TOKEN INT DOUBLE CHAR%left PLUS MINUS%left TIMES OVER%right UMINUS%%lines : lines expr EOL { printf("%g\n", $2); } | lines EOL | lines COMMENT | ;expr : expr PLUS expr { $$ = $1 + $3; }|expr MINUS expr{ $$ = $1 - $3; }|expr TIMES expr{ $$ = $1 * $3; }|expr OVER expr{ $$ = $1 / $3; }|LP expr RP{ $$ = $2; }|'-' expr %prec UMINUS{ $$ = -$2; }|NUMBER {$$=$1;} //$$=$1 can be ignored | ID //should be complemented ; %%int main(int argc, char *argv[]){ printf("a cacluator which support +,-,*,/ and (): \n"); printf(" e.g. 12.2+3*(2+5)\n"); int n = 1; mylexer lexer; myparser parser; if (parser.yycreate(&lexer)) { if (lexer.yycreate(&parser)) { //lexer.yyin = new ifstream(argv[1]); //lexer.yyout = new ofstream(argv[2]); n = parser.yyparse(); //parse_tree.get_label(); //parse_tree.gen_code(*lexer.yyout); } } getchar(); return n;}
点击Pargen右上角的编译build按钮,会生成相应的.h和.cpp代码
新建vs2010工程,并将生成的.h和.cpp代码加入到工程中。简单起见,在comple\Test目录下创建vs工程vsTest
选择控制台工程, 工程的目录,以及工程名称vsTest,点击确定按钮后
继续下一步配置
此处附件选项选择空项目,然后点击完成按钮,即完成vsTest工程创建
工程右键添加现有项,即添加已经生成.h和.cpp文件
在vs界面,点击编译按钮,查看当前的编译情况,会显示编译错误,找不到yy的头文件,这是因为并没有将Pargen安装后的头文件加入到工程的包含目录中
下面将Pargen安装后的头文件加入到工程include配置
在vs界面,点击编译按钮,查看编译情况。 当前头文件可以正常找到,会出现大量的链接错误-link error。这是因为对应的lib文件还没有加载进来。
下面加入库文件,加入库所在目录
加入要使用的库的名字:ylmtri.lib, 注意使用分号隔开
再次点击编译按钮,会发现可以编译,但是运行的时候,会出现ylmtri.dll的错误。这是因为我们使用动态dll库,需要将对应的dll文件从Pargen目录复制到工程目录的exe文件同级目录下
下面开始将ylmtri.dll从Pargen目录复制到vsTest.exe同级目录
再次点击编译运行按钮,可以正常运行,效果如下
出处:http://blog.csdn.net/lpstudy/article/details/51330063
在最后一步的过程中,遇到了添加完ylmtri.dll仍然报错的情况,也是比较尴尬,在解决之后再修改。
- lex和yacc环境配置
- lex&yacc环境配置
- 小白说编译原理-6-lex和yacc环境配置-多图
- vc++与YACC和LEX集成环境
- vc++与YACC和LEX集成环境
- vc++与YACC和LEX集成环境
- VC++与YACC和LEX集成环境
- VC++与YACC 和LEX 集成环境
- Windows 7下配置Lex和Yacc
- Lex 和 Yacc 编程环境配置(Parser Generator2 + VC6.0 配置)
- Lex和Yacc.之Lex
- lex&yacc安装配置
- lex&yacc安装配置
- Lex和Yacc从入门到精通(1)--环境配置篇
- windows下yacc和lex开发环境配置(Parser Generator篇)
- Lex和Yacc从入门到精通(1)--环境配置篇
- Lex和Yacc从入门到精通(1)--环境配置篇
- Lex和Yacc从入门到精通(1)--环境配置篇
- 解决办法: Error:(2, 0) Plugin with id 'com.github.dcendents.android-maven' not found.
- 可逆素数(难度:半颗星)
- 最长子序列回文问题,Longest Palindromic Subsequence
- thinkphp 3.2 使用phpqrcode生成二维码,phpqrcode的使用
- 经典算法1---相似度--模糊查询,查抄袭,语言识别
- lex和yacc环境配置
- 《数学之美》阅读笔记part2——第16章到第31章
- hibernate中实体类对象状态
- C++指针作为函数参数的问题
- 我的学习之路_第二章java入门_接口/多态
- PHP之浅谈RGB
- 同域名下Linux系统配置多个Tomcat
- 18 java IO
- Ajax--带进度条的文件上传