0

我正在使用 flex 从声明语句中生成标记:

int a = 5;

令牌是:

<int> <id,a> <=> <5>

请注意,int 的词素是 int,a 是令牌 id 的词素。

来到 lex 代码:

%{
#define YYSTYPE char*
#include "parser.tab.h"
#include "stdlib.h"

int lineno=1;
%}

white [ \t]+
letter [A-Za-z]
digit [0-9]
id {letter}({letter}|{digit})*
number {digit}+
relop >=|<=|>|<|==|!=


%% 

{white} { }

{number} {yylval=strdup(yytext); return NUMBER;}
{id} { yylval=strdup(yytext); return ID;}
"+" return PLUS;
"-" return MINUS;
"*" return TIMES;
"/" return DIVIDE;
int return INT;
float return FLOAT; 

问题是字符串 int 和 float 被匹配为 ID,并且令牌作为 ID 返回。因此存在语法错误。有没有办法解决这个问题?

4

1 回答 1

1

首先放置 int/float 行,您列出它们的顺序是匹配的顺序。

规则 letter(letter|number)* 将匹配多个字母之一的任意序列,将 float 放在其上方,float 将在尝试之前匹配 letter(letter|number)

首先,我的意思是“在 ID 之上的任何地方,仍在定义部分”

于 2013-11-14T18:09:25.820 回答