Flex:无法创建

时间:2015-10-28 15:07:09

标签: windows flex-lexer

我已经将flex与cygwin一起使用了,它运行得很好,所以我已经为windows安装了flex,因为我需要一个Windows版本的程序。当我试图创建词法分析器时,我收到了消息:

flex: could not create.

这是文件(适用于cygwin):

%{
  #include "Ast.h"
  #include "Parser.hpp"
  #include <stdio.h>
  #include <string>
  #define SAVE_TOKEN_STR yylval.string = new std::string(yytext, yyleng)
  #define TOKEN(t) (yylval.token = t)
%}
%%
[0-9]+                                      { SAVE_TOKEN_STR; return INTEGER; }
[0-9]+\.[0-9]+                              { SAVE_TOKEN_STR; return FLOAT; }
[0-9]+(\.[0-9]+)?[eE][-+]?[0-9]+(\.[0-9]+)? { SAVE_TOKEN_STR; return SCIENTIFIC; }
"("    { return TOKEN(LPAR); }
")"    { return TOKEN(RPAR); }
"{"    { return TOKEN(LCBR); }
"}"    { return TOKEN(RCBR); }
"["    { return TOKEN(LSQBR); }
"]"    { return TOKEN(RSQBR); }
"+"    { return TOKEN(PLUS); }
"-"    { return TOKEN(MINUS); }
"*"    { return TOKEN(STAR); }
"/"    { return TOKEN(SLASH); }
"%"    { return TOKEN(PERCENT); }
"**"   { return TOKEN(EXPONENT); }
"="    { return TOKEN(ASSIGN); }
"=="   { return TOKEN(EQ); }
"<>"   { return TOKEN(NEQ); }
"<"    { return TOKEN(LESS); }
"<="   { return TOKEN(LOE); }
"<=>"  { return TOKEN(SPACESHIP); }
">"    { return TOKEN(GREATER); }
">="   { return TOKEN(GOE); }
"!"    { return TOKEN(NOT); }
"&&"   { return TOKEN(AND); }
"||"   { return TOKEN(OR); }
"not"  { return TOKEN(NOT); }
"and"  { return TOKEN(AND); }
"or"   { return TOKEN(OR); }
"~"    { return TOKEN(BITWISE_NOT); }
"&"    { return TOKEN(BITWISE_AND); }
"|"    { return TOKEN(BITWISE_OR); }
"^"    { return TOKEN(BITWISE_XOR); }
"<<"   { return TOKEN(BITWISE_LSHIFT); }
">>"   { return TOKEN(BITWISE_RSHIFT); }
"~~"   { return TOKEN(ROUND); }
"."    { return TOKEN(DOT); }
".."   { return TOKEN(RANGE); }
"..."  { return TOKEN(TRANGE); }
"?"    { return TOKEN(QUESTION_MARK); }
":"    { return TOKEN(COLON); }
"in"   { return TOKEN(IN); }
","    { return TOKEN(COMMA); }
[A-Za-z_][A-Za-z0-9_]*    { SAVE_TOKEN_STR; return IDENT; }
[ \n\t] ;
.      { printf("Illegal token!\n"); yyterminate(); }
%%
#ifndef yywrap
  yywrap() { return 1; }
#endif 

这是我正在尝试执行的命令:

flex -o Lexer.l Lexer.cpp

在cygwin中唯一的区别是我需要在命令中切换源文件名和destionation文件名。

编辑:

如果我尝试:

flex -o Lexer.cpp Lexer.l

我明白了:

flex: can't open Lexer.cpp

1 个答案:

答案 0 :(得分:1)

flex -o Lexer.l Lexer.cpp

告诉flex处理输入文件Lexer.cpp,并将输出-o)放在Lexer.l中。我猜这不是你想要做的,因为通常Lexer.l将是输入,并且不希望覆盖它。

在非常古老的flex版本(和flex 2.5.4a,正如“flex for windows”所使用的那样,算作一个非常古老的版本),你不能在-o之后放置一个空格。文件名必须紧跟字母o。所以正确的命令行是:

flex -oLexer.cpp Lexer.l

顺便说一下,

#include "Ast.h"
#include "Parser.hpp"
#include <stdio.h>
#include <string>

真的不是好风格。通常,系统(库)标头应该是#include d,并且通常使用C ++,您将使用#include <cstdio>而不是C标头stdio.h。但这与你的问题无关。