在弹性扫描中将标识符与关键字分开

时间:2013-11-14 18:06:31

标签: flex-lexer

我使用flex从声明语句中生成令牌:

int a = 5;

代币是:

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

请注意,int的lexeme是int,而a是令牌id的lexeme。

来到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返回。因此存在语法错误。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

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

规则字母(字母|数字)*将匹配任何一个或多个字母的序列,将浮点放在它上面,浮点数将匹配,然后再尝试字母(字母|数字)

首先,我指的是“ID以上的任何地方,仍然在定义部分”