【发布时间】: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