【发布时间】:2013-04-24 04:13:09
【问题描述】:
我正在使用 JavaCC 来模拟一小部分 SQL 语法,但我在定义 密码 时遇到了问题。
我正在为 a 写语法规则
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 列,“#”不能作为字符串文字标记匹配。它将匹配为
。
我的朋友也有类似的建议,但也没有奏效。 有人可以帮我解决这个问题吗?
【问题讨论】:
标签: passwords token grammar rule javacc