国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

CMake

2019-11-11 01:07:44
字體:
供稿:網(wǎng)友

Reference

cmake bison command: https://cmake.org/cmake/help/v3.6/module/FindBISON.htmlcmake flex command: https://cmake.org/cmake/help/v3.6/module/FindFLEX.html

內(nèi)容

CMake處理lex和yacc文件。即自動(dòng)將lex&yacc文件轉(zhuǎn)換成為c/c++文件,然后生成庫文件或可執(zhí)行文件。

lex

這里只有一個(gè)lex文件(test.ll),然后生成可執(zhí)行文件ttest。——test是cmake保留字,所以這里用ttest。

目錄結(jié)構(gòu)

兩個(gè)子目錄:

test/src: test.ll, CMakeLists.txttest/bin: 工作目錄,一開始為空,生成的文件都放在這里。

文件

test.ll

%{#include <string>#include <iostream>%}%%[/t ]+ /* white space */[a-zA-Z]+ { std::string Word(yytext); std::cout<<"word: "<<word<<std::endl; }[0-9]+ { std::string number(yytext); std::cout<<"number: "<<number<<std::endl; }.|/n {ECHO; /* normal default anyway */ }%%int main(){ std::cout<<"Lex and C++"<<std::endl; yylex(); return 0;}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)PRoject(ttest)# bison and flexfind_package(BISON)find_package(FLEX)FLEX_TARGET(ttest_lexer test.ll ${PROJECT_BINARY_DIR}/test.cpp)# mainset (MAIN_SRC ${PROJECT_BINARY_DIR}/test.cpp)add_executable(ttest ${MAIN_SRC})# librariesfind_library(LEX_LIB l)target_link_libraries(ttest ${LEX_LIB})

或者

cmake_minimum_required(VERSION 2.8)project(ttest)# bisonfind_package(FLEX)FLEX_TARGET(ttest_lexer test.ll ${CMAKE_CURRENT_BINARY_DIR}/test.cpp)# mainadd_executable(ttest ${CMAKE_CURRENT_BINARY_DIR}/test.cpp)# librariesfind_library(LEX_LIB l)target_link_libraries(ttest ${LEX_LIB})

Run

$ ./ttest Lex and C++abd 123word: abdnumber: 123^C

lexer&parser

Files

兩個(gè)文件:test.ll, test.yy. 最后生成可執(zhí)行文件ttest。

test.ll

%{//#include <string>#include "y.tab.h"%}%%[/t ]+ ;[a-zA-Z]+ {return OBJECT;}[0-9]+ {return PRICE;}.|/n {ECHO;}

test.yy

%{#include <stdio.h> extern int yylex (void);void yyerror(const char *s, ...);%}%token OBJECT PRICE%%description: object PRICE { printf("pass.../n"); } ;object: OBJECT ;%%extern FILE *yyin;int main(int argc, const char* argv[]){ if (argc != 2) { printf("Usage: %s filename/n", argv[0]); return 0; } yyin = fopen(argv[1], "rb"); if (NULL == yyin) { printf("Open file failed: %s/n", argv[1]); return 0; } while(!feof(yyin)) { yyparse(); } fclose(yyin); yyin = NULL; return 0;}void yyerror(const char *s, ...){ fprintf(stderr, "%s/n", s);}

不用cmake

執(zhí)行如下命令:

yacc -d test.yylex test.llgcc -o test lex.yy.c y.tab.c -ll

運(yùn)行示例:

$ ./test Usage: ./test filename$ echo phone 1000 > ok.txt$ echo tom jerry > fail.txt$ ./test ok.txt pass...$ ./test fail.txt syntax error$

用cmake

首先修改test.ll中的頭文件名稱:

#include "y.tab.h" --> #include "parser.h"

同樣創(chuàng)建src/bin/CMakeLists.txt。其中cmake文件內(nèi)容:

cmake_minimum_required(VERSION 3.5)project(ttest)# bison and flexfind_package(BISON)find_package(FLEX)BISON_TARGET(ttest_parser test.yy ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/parser.h )FLEX_TARGET(ttest_lexer test.ll ${CMAKE_CURRENT_BINARY_DIR}/lexer.cpp)# default header file is parser.hppADD_FLEX_BISON_DEPENDENCY(ttest_lexer ttest_parser)# maininclude_directories(${CMAKE_CURRENT_BINARY_DIR})set (MAIN_SRC ${CMAKE_CURRENT_BINARY_DIR}/lexer.cpp ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp# or ${BISON_ttest_parser_OUTPUTS}${FLEX_ttest_lexer_OUTPUTS} )add_executable(ttest ${MAIN_SRC})find_library(LEX_LIB l)target_link_libraries(ttest ${LEX_LIB})

注意到對于生成的cpp文件的兩種引用方式。

另,根據(jù)https://cmake.org/cmake/help/v3.6/release/3.4.html的說法,可能cmake版本要求至少是3.4:

The FindBISON module BISON_TARGET macro learned a new DEFINES_FILE option to specify a custom output header to be generated.

lex&parser打包成庫文件

假定要把lexer&parser的代碼打包成lib,然后供其他的cpp調(diào)用。為此,把test.yy中的main()搬到一個(gè)新的main.cpp文件中:

#include <stdio.h>extern FILE *yyin;extern int yyparse();int main(int argc, const char* argv[]){ if (argc != 2) { printf("Usage: %s filename/n", argv[0]); return 0; } yyin = fopen(argv[1], "rb"); if (NULL == yyin) { printf("Open file failed: %s/n", argv[1]); return 0; } while(!feof(yyin)) { yyparse(); } fclose(yyin); yyin = NULL; return 0;}

然后cmake文件改為:

cmake_minimum_required(VERSION 3.5)project(ttest)# bison and flexfind_package(BISON)find_package(FLEX)BISON_TARGET(ttest_parser test.yy ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/parser.h )FLEX_TARGET(ttest_lexer test.ll ${CMAKE_CURRENT_BINARY_DIR}/lexer.cpp)# default header file is parser.hppADD_FLEX_BISON_DEPENDENCY(ttest_lexer ttest_parser)include_directories(${CMAKE_CURRENT_BINARY_DIR})add_library(myparser ${BISON_ttest_parser_OUTPUTS} ${FLEX_ttest_lexer_OUTPUTS} )# mainadd_executable(ttest main.cpp)target_link_libraries(ttest myparser)find_library(LEX_LIB l)target_link_libraries(ttest ${LEX_LIB})
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 攀枝花市| 韶山市| 仪征市| 保亭| 米林县| 南华县| 焦作市| 乌拉特前旗| 铜鼓县| 上蔡县| 都匀市| 尖扎县| 晋中市| 如东县| 桦川县| 汽车| 泊头市| 无极县| 乐清市| 马关县| 奉新县| 柘城县| 香港 | 桂平市| 界首市| 聂拉木县| 文成县| 六盘水市| 昌黎县| 蒙阴县| 乌苏市| 吴桥县| 称多县| 阳朔县| 咸宁市| 南靖县| 塔河县| 凤阳县| 西昌市| 镇原县| 浑源县|