我在我的lex代码中收到了gcc的错误:“没有#if的#endif”

时间:2015-10-13 01:26:32

标签: lex

这是我第一次尝试使用flex和bison编写编译器。我写了一些看起来像法律lex和yacc代码的东西,但是当我通过编译器运行时,我收到一条错误消息。这似乎来自gcc,因此flex生成的代码有问题。

ghlex.l:20:2:错误:#endif没有#if  .map返回DOTMAP;

有人能告诉我.map模式和/或动作有什么问题吗? (如果它不明显或我错误编码,那应该匹配令牌“.map”)

这是我的lex / flex源代码:

%{
#include <stdio.h>
#include <string.h>
#include "gh.tab.h"
%}
DIGIT       [0-9]
STARTCHAR   [_a-zA-Z]
WORDCHAR    {DIGIT}|{STARTCHAR}
FILECHAR    {WORDCHAR}|[-.+@#$%()]
FILECHAR1   {FILECHAR}|[/" ]
FILECHAR2   {FILECHAR}|[/' ]
 /* special "start states" for matching
%s DESC FNAME1 FNAME2
%%
{DIGIT}+    yylval.number = atoi(yytext); return INT;
{STARTCHAR}{WORDCHAR}* yylval.string = strdup(yytext); return WORD;
FILECHAR$   yylval.string = strdup(yytext); return FILEPART;
'FILECHAR1+'        yylval.string = strdup(yytext); return QUOTE;
"FILECHAR2+"        yylval.string = strdup(yytext); return QUOTE;
\.map       return DOTMAP;
\.m return DOTM;
\.r return DOTR;
\.c return DOTC;
\.d return DOTD;
\.t return DOTT;
\.o return DOTO;
\.u return DOTU;
\.v return DOTV;
,   return COMMA;
\+  return PLUS;
-   return MINUS;
\/  return SLASH;
;   return SEMI;
\[  return LBRACKET;
\]  return RBRACKET;
\%\$        return PCTDOL;
\%\/        return PCTSLASH;
\%t return PCTT;
\%@ return PCTAT;
\n  /* ignore newlines */
[ \t]       /* ignore whitespace */
\/\/        /* ignore c++-style comments */
<DESC>.*    yylval.string = strdup(yytext); return STRING;
%%

1 个答案:

答案 0 :(得分:2)

问题在于第12行您未经评论的评论:

  /* special "start states" for matching

因为这一行以空格开头,所以它会逐字复制到lex.yy.c文件中,在那里它会搞砸,注释掉flex生成的几行,包括#ifdef和{{1使编译器输出更好的行号信息的指令。

如果使用#line进行编译(您总是应该这样做),那么在错误之前您将获得-Wall ,这至少暗示问题与注释(虽然此消息的行号也不正确。)