【问题标题】:Separating Identifiers from keywords in flex scanning在弹性扫描中将标识符与关键字分开
【发布时间】:2013-11-14 18:06:30
【问题描述】:

我正在使用 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 返回。因此存在语法错误。有没有办法解决这个问题?

【问题讨论】:

    标签: flex-lexer


    【解决方案1】:

    将 int/float 行放在首位,您列出它们的顺序就是匹配的顺序。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多