我已经将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
答案 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
。但这与你的问题无关。