我使用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返回。因此存在语法错误。有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
首先放置int / float行,列出它们的顺序是匹配的顺序。
规则字母(字母|数字)*将匹配任何一个或多个字母的序列,将浮点放在它上面,浮点数将匹配,然后再尝试字母(字母|数字)
首先,我指的是“ID以上的任何地方,仍然在定义部分”