这是我第一次尝试使用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;
%%
答案 0 :(得分:2)
问题在于第12行您未经评论的评论:
/* special "start states" for matching
因为这一行以空格开头,所以它会逐字复制到lex.yy.c文件中,在那里它会搞砸,注释掉flex生成的几行,包括#ifdef
和{{1使编译器输出更好的行号信息的指令。
如果使用#line
进行编译(您总是应该这样做),那么在错误之前您将获得-Wall
,这至少暗示问题与注释(虽然此消息的行号也不正确。)