我使用 JavaCC 确实模拟了一小部分 SQL 语法,但在定义密码时遇到了问题。
我正在为一个写语法规则
CREATE USER user_name IDENTIFIED BY a_password
声明,我被卡住了。由于密码可以与任何东西匹配asdkj*!@#
,或!@%^%ASDjnkj
等_ASDJLJK@#&
。请注意,在 Oracle 中,输入不带单引号 ( '
) 的密码是完全合法的。如果引号是强制性的,我可以很容易地解决这个问题,但不幸的是它们不是。
我尝试了很多方法来为这个密码定义一个令牌/语法规则,但它没有像我预期的那样工作,我尝试过的最新规则是:
TOKEN : {
< S_PASSWORD: ( < DIGIT > | < LETTER > |< S_PASSCHAR >)+ >
| <#S_PASSCHAR : "!"|"@"|"#"|"$"|"%"|"^"|"&"|"*" >
| <#LETTER: ["a"-"z", "A"-"Z", "_"]>
| <#DIGIT: ["0" - "9"]>
}
但是因为< S_PASSWORD >
可以匹配任何东西,所以我之前定义的任何其他标记都将与之匹配,并且我总是会收到这样的 JavaCC 警告:
警告:“#”不能匹配为第 33515 行第 13 列的字符串文字标记。它将匹配为 < S_PASSWORD >。
我的朋友也有类似的建议,但他们也没有奏效。有人可以帮我弄这个吗?