我已经用cygwin使用flex,它工作得很好,所以我安装了flex for windows,因为我需要一个windows版本的程序。当我试图创建词法分析器我得到的消息:Flex:无法创建
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
它是否真的产生错误消息'flex:could not create.' like that,a period after following'create'? – rici
是的,这是确切的输出 –
嗯,这很奇怪。格式字符串是“无法创建%s”,它有一个空格并且没有'.'。由于特殊的参数解析策略,文件名是空字符串,所以我期望错误信息是“无法创建”的,最后有一个不可见的空间。但我想这只是一个小细节。 – rici