Flex, Bison, C++ all in Xcode
Flex, Bison, C++ all in Xcode
我正在解决可重入Flex和Bison的问题。它在我的机器上编译和运行得很好。我想做的是利用c++ STL。每当我尝试包含CPP头时,它都说找不到它。关于这个问题,谷歌上只有少数几个问题。有没有人有这种设置的一个工作的例子,或一个解决方案,我可能实现?
任何帮助都将是非常感激的。
谢谢!
EDIT所以出于某种原因,我必须在构建设置中添加任何头的包含路径。一定是由于这个人的例子的自定义makefile。这超出了我的工资范围。无论如何,我现在可以在main中使用STL库了。
我真正想做的是使用FLEX/BISON与CPP,如果我试图包括STL头在任何地方除了主,我得到错误"头未找到"。
我可以包括c头很好,虽然。
这是链接主题中另一个答案的作者的回答。
我已经修改了我的例子来使用c++。
关键是:
-
我正在使用最近的Flex/Bison:
brew install flex
和brew install bison
。不确定是否同样的工作与默认的OSX/Xcode的flex/bison
。 -
生成的flex/bison文件应该有c++扩展(lexer。[hpp|mm],解析器。[hpp|mm])用于Xcode拾取c++代码。
-
有一个Xcode的构建阶段运行
Make
所有相关文件都在下面,但我建议您查看示例项目。
main.mm
的代码是
#include "parser.hpp"
#include "lexer.hpp"
extern YY_BUFFER_STATE yy_scan_string(const char * str);
extern void yy_delete_buffer(YY_BUFFER_STATE buffer);
ParserConsumer *parserConsumer = [ParserConsumer new];
char input[] = "RAINBOW UNICORN 1234 UNICORN";
YY_BUFFER_STATE state = yy_scan_string(input);
yyparse(parserConsumer);
yy_delete_buffer(state);
Lexer.lm:
%{
#include "ParserConsumer.h"
#include "parser.hpp"
#include <iostream>
#include <cstdio>
int yylex(void);
void yyerror(id <ParserConsumer> consumer, const char *msg);
%}
%option header-file = "./Parser/Generated Code/lexer.hpp"
%option outfile = "./Parser/Generated Code/lexer.mm"
%option noyywrap
NUMBER [0-9]+
STRING [A-Z]+
SPACE x20
%%
{NUMBER} {
yylval.numericValue = (int)strtoul(yytext, NULL, 10);
std::cout << "Lexer says: Hello from C++n";
printf("[Lexer, number] %sn", yytext);
return Token_Number;
}
{STRING} {
yylval.stringValue = strdup(yytext);
printf("[Lexer, string] %sn", yytext);
return Token_String;
}
{SPACE} {
// Do nothing
}
<<EOF>> {
printf("<<EOF>>n");
return 0;
}
%%
void yyerror (id <ParserConsumer> consumer, const char *msg) {
printf("%sn", msg);
abort();
}
Parser.ym
:
%{
#include <iostream>
#include <cstdio>
#include "ParserConsumer.h"
#include "parser.hpp"
#include "lexer.hpp"
int yylex();
void yyerror(id <ParserConsumer> consumer, const char *msg);
%}
%output "Parser/Generated Code/parser.mm"
%defines "Parser/Generated Code/parser.hpp"
//%define api.pure full
%define parse.error verbose
%parse-param { id <ParserConsumer> consumer }
%union {
char *stringValue;
int numericValue;
}
%token <stringValue> Token_String
%token <numericValue> Token_Number
%%
/* http://www.tldp.org/HOWTO/Lex-YACC-HOWTO-6.html 6.2 Recursion: 'right is wrong' */
tokens: /* empty */
| tokens token
token:
Token_String {
std::cout << "Parser says: Hello from C++n";
printf("[Parser, string] %sn", $1);
[consumer parserDidParseString:$1];
free($1);
}
| Token_Number {
printf("[Parser, number]n");
[consumer parserDidParseNumber:$1];
}
%%
Makefile
:
generate-parser: clean flex bison
clean:
rm -rf './Parser/Generated Code'
mkdir -p './Parser/Generated Code'
flex:
# brew install flex
/usr/local/bin/flex ./Parser/Lexer.lm
bison:
# brew install bison
/usr/local/bin/bison -d ./Parser/Parser.ym
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- C++ MFC Libraries in Travis CI
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Xcode 语义问题引用或以前定义的代码
- 使用 Xcode 将双精度存储在数组C++中
- OpenCV UIImageToMat linker fail in xcode
- 犰狳/ Xcode:无处"functions that differ only in their return type cannot be overloaded"错误
- OpenCV, XCode 中的链接错误, 架构的未定义符号 x86_64: "_cvHaarDetectObjects" , 引用自: _main in main.o
- Programming in C++ with Xcode 4
- Flex, Bison, C++ all in Xcode
- 如何在Xcode 4中摆脱"In class initializer for static data member ... is a C++0x extension"警告