BISON+FLEX 使用短形式的代币
BISON+FLEX using short form of tokens
我想实现一些命令语言...
有没有办法实现令牌重新配置以获取 "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
我看到 "syntax error, unexpected id",id 它的 identifier 模式如下:
identifier [$_a-zA-Z][$_a-zA-Z0-9\%\*]*
有什么想法吗?我还需要检查什么?
谢谢!
此语法没有 shorthand,但您可以简单地使用,例如:
CRE(A(TE?)?)? { return KWD_CREATE;}
DEL(E(TE?)?)? { return KWD_DELETE;}
如果您使用某种 generator-generator 生成您的词法分析器(我发现这种技术非常有用),那么以编程方式完成这件事就足够容易了。
测试:
$ 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
我想实现一些命令语言... 有没有办法实现令牌重新配置以获取 "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
我看到 "syntax error, unexpected id",id 它的 identifier 模式如下:
identifier [$_a-zA-Z][$_a-zA-Z0-9\%\*]*
有什么想法吗?我还需要检查什么?
谢谢!
此语法没有 shorthand,但您可以简单地使用,例如:
CRE(A(TE?)?)? { return KWD_CREATE;}
DEL(E(TE?)?)? { return KWD_DELETE;}
如果您使用某种 generator-generator 生成您的词法分析器(我发现这种技术非常有用),那么以编程方式完成这件事就足够容易了。
测试:
$ 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