【问题标题】:BISON+FLEX using short form of tokensBISON+FLEX 使用短形式的令牌
【发布时间】:2019-07-23 15:22:04
【问题描述】:

我想实现一些命令 lang ... 有没有办法实现令牌重新配置以获取“CREATE”的令牌:

CREATE  
CRE
CREA
CREAT

另一个例子:

DELE
DEL
DELET
DELETE

对于令牌“DELETE”

我知道这样的方式:

"CREATE" { return KWD_CREATE;}
"CRE"    { return KWD_CREATE;}


"DEL"     { return KWD_DELETE;}
"DELET"   { return KWD_DELETE;}

但是,有没有正确的方法来识别关键字的简化形式?

更新:我已经尝试过建议的技巧,例如:

CRE(A(T(E?)?)?   { return KWD_CREATE;}
DEL(E(T(E?)?)?   { return KWD_DELETE;}

但是下一个问题发生了:

CREATE - is recognized
CREAT - is recognized
CREA - is **not** recognized

我看到“语法错误,意外 id”,id 它的 identifier 模式如下:

identifier  [$_a-zA-Z][$_a-zA-Z0-9\%\*]*

有什么想法吗?我需要额外检查什么?

谢谢!

【问题讨论】:

  • 当你通过 flex 运行它时,那个模式不是给你一个错误吗?顺便说一句,在字符类 ([...]) 中,您不需要反斜杠转义正则表达式字符。除了反斜杠本身以及-] 之外,它们都没有什么特别之处。 (在字符类之外,-] 并不特殊,不需要转义。)
  • 好的。让我只检查解析器的 FLEX 部分(不带 BISON)。再次感谢!
  • 我指的是带有不平衡括号的模式(在我修复它之前)。当我通过 flex 传递它时,它给了我一个“无法识别的规则”错误,这使得拼写错误很明显。我只是好奇。

标签: bison flex-lexer


【解决方案1】:

此语法没有简写,但您可以简单地使用,例如:

CRE(A(TE?)?)?   { return KWD_CREATE;}
DEL(E(TE?)?)?   { return KWD_DELETE;}

如果您使用某种生成器生成词法分析器(我觉得非常有用的一种技术),那么以编程方式完成这将很容易。

测试:

$ cat abbrev.l
%option noinput nounput noyywrap nodefault 8bit
%%
cre(a(te?)?)?   { fprintf(stderr, "%s\n", "CREATE"); }
del(e(te?)?)?   { fprintf(stderr, "%s\n", "DELETE"); }
[[:alpha:]]+    { fprintf(stderr, "WORD: %s\n", yytext); }
[[:space:]]+    ;
.               { fprintf(stderr, "PUNC: %c\n", *yytext); }
$ flex -o abbrev.c abbrev.l
$ gcc -Wall -o abbrev abbrev.c -lfl
$ ./abbrev
create
CREATE
creat
CREATE
crea
CREATE
cre
CREATE
cr
WORD: cr
delete
DELETE
delet
DELETE
dele
DELETE
del
DELETE
de
WORD: de

【讨论】:

  • 刚试过。 “创造” - 好的,“创造” - 好的,“创造” - 错误。看起来 FLEX 期望更多的字符来识别模式。有什么想法吗?
  • @Ruslan:抱歉,这些模式中有一个杂散的开括号。我修复了它,并进行了测试。我将添加测试代码。
  • 没问题!我纠正了模式。谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多