网站关键词排名怎么提升,中国光刻机最新消息,山西省建设厅政务中心网站,酒店团购的网站建设lex和yacc的使用很简单#xff0c;但环境配置却是各种问题#xff0c;本章说明lex和yacc在windows下的环境配置。 软件需求#xff1a; 系统 win7-64位(win7-32, win8, win10全部通过) c编译器#xff1a; vs2010(2008,2013,2015也全部通过) lex和yacc编译器#xff1a… 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 functionYYSTYPE 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_DEUBcouttoken: token lex:lexendl;
#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.23*(25)\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仍然报错的情况也是比较尴尬在解决之后再修改。