BISON+FLEX使用缩写形式的代币



我想实现一些命令 lang ...有没有办法实现令牌重新识别以获取"创建"的令牌:

CREATE  
CRE
CREA
CREAT

再比如:

DELE
DEL
DELET
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  [$_a-zA-Z][$_a-zA-Z0-9%*]*

知道吗?我需要另外检查什么?

谢谢!

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

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, "%sn", "CREATE"); }
del(e(te?)?)?   { fprintf(stderr, "%sn", "DELETE"); }
[[:alpha:]]+    { fprintf(stderr, "WORD: %sn", yytext); }
[[:space:]]+    ;
.               { fprintf(stderr, "PUNC: %cn", *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

最新更新