Passwords JavaCC:定义*密码*标记或语法规则

Passwords JavaCC:定义*密码*标记或语法规则,passwords,token,grammar,rule,javacc,Passwords,Token,Grammar,Rule,Javacc,我正在使用JavaCC模拟SQL语法的一小部分,但我在定义密码方面遇到了问题 我正在为一个学生写语法规则 CREATE USER user_name IDENTIFIED BY a_password 声明,我被卡住了。因为密码可以与任何类似asdkj*的东西匹配@#,或!@%^%ASDjnkj、\u ASDJLJK@#&等。请注意,在Oracle中,输入密码时不带单引号(”)是完全合法的。如果引号是强制性的,我可以很容易地解决这个问题,但不幸的是它们不是 我尝试了多种方法来定义此密码的令牌/语

我正在使用JavaCC模拟SQL语法的一小部分,但我在定义密码方面遇到了问题

我正在为一个学生写语法规则

CREATE USER user_name IDENTIFIED BY a_password
声明,我被卡住了。因为密码可以与任何类似
asdkj*的东西匹配@#,或
!@%^%ASDjnkj
\u ASDJLJK@#&
等。请注意,在Oracle中,输入密码时不带单引号(
)是完全合法的。如果引号是强制性的,我可以很容易地解决这个问题,但不幸的是它们不是

我尝试了多种方法来定义此密码的令牌/语法规则,但没有如我预期的那样有效,我尝试的最新规则是:

TOKEN : {
< S_PASSWORD: ( < DIGIT > | < LETTER > |< S_PASSCHAR >)+ >
|  <#S_PASSCHAR : "!"|"@"|"#"|"$"|"%"|"^"|"&"|"*" > 
|  <#LETTER: ["a"-"z", "A"-"Z", "_"]>
|  <#DIGIT: ["0" - "9"]>
}
令牌:{
)+>
|   
|  
|  
}
但是由于
可以匹配任何东西,所以我之前定义的任何其他令牌都将与之匹配,并且我总是会收到如下JavaCC警告:

警告:“#”不能作为字符串文字标记在第33515行第13列进行匹配。它将被匹配为

我的朋友们也提出了类似的建议,但也没用。
有人能帮我吗?

假设有某种词汇方法来判断密码的开始和结束位置,您可以使用词汇状态。例如,如果由标识的序列后面只跟有密码的空格,则创建一个状态机,以便标识的序列从默认状态转换为S0。在S0中,空间被跳过,并被转换到S1。在S1中,跳过空格,并且密码字符序列是密码令牌;密码令牌转换回默认值。当然,这只有在标识为只能后跟密码的情况下才有效。同样在S0中,您需要能够处理所有正常的内容,因此您的大多数令牌规则应该同时适用于S0和DEFAULT状态,但要转换为DEFAULT状态。有关词法状态的更多信息,请参见常见问题解答

如果BY后面只跟一个密码,那么就更容易了,因为您不需要S0


编辑

下面是一些示例规则。如果关键字BY后面只跟有密码,则只需要两种状态

TOKEN : { <BY : "BY"> : S1>
<S1> TOKEN : { <PASSWORD : ( <PASSWORDCHAR> )+ } : DEFAULT }
<DEFAULT, S1> : SKIP { " " } // Stays in the same state.
TOKEN:{:S1>
标记:{//BY后面的标识
标记:{:默认值}不遵循标识的BY。
代币:{
<DEFAULT, S0> TOKEN : { <CREATE : "CREATE"> : DEFAULT } // And similar for most token rules.
<DEFAULT, S0> TOKEN : { <IDENTIFIED : "IDENTIFIED"> : S1 }
<S0> TOKEN : { <BY : "BY"> : S1> // BYs that follow IDENTIFIED
<DEFAULT> TOKEN : { <BY : "BY"> : DEFAULT } BYs that don't follow IDENTIFIED.
<S1> TOKEN : { <PASSWORD : ( <PASSWORDCHAR> )+ } : DEFAULT }
<DEFAULT, S0, S1> : SKIP { " " } // Stays in the same state.