【问题标题】:JavaCC: Defining a *password* token or grammar ruleJavaCC:定义 *password* 标记或语法规则
【发布时间】: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"]>
}

但是由于&lt; S_PASSWORD &gt; 可以匹配任何东西,所以我之前定义的任何其他标记都将匹配它,并且我总是收到这样的 JavaCC 警告:

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

我的朋友也有类似的建议,但也没有奏效。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: passwords token grammar rule javacc


    【解决方案1】:

    假设有一些词法方法来判断密码的开始和结束位置,您可以使用词法状态。例如,如果序列 IDENTIFIED BY 后面只跟空格,后面跟密码,则创建一个状态机,以便 IDENTIFIED 从 DEFAULT 转换到 S0。在 S0 中,空格被跳过并 BY 转换到 S1。在 S1 中,空格被跳过,密码字符序列是 PASSWORD 令牌; PASSWORD 令牌转换回 DEFAULT。当然,这只有在 IDENTIFIED BY 后面只能跟密码时才有效。同样在 S0 中,您需要能够处理所有正常的东西,因此您的大多数令牌规则都应适用于 S0 和 DEFAULT 状态,但要过渡到 DEFAULT。有关词法状态的更多信息,请参阅常见问题解答。

    如果 BY 后面只跟密码,那就更简单了,因为你不需要 S0。


    编辑

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

    TOKEN : { <BY : "BY"> : S1>
    <S1> TOKEN : { <PASSWORD : ( <PASSWORDCHAR> )+ } : DEFAULT }
    <DEFAULT, S1> : SKIP { " " } // Stays in the same state.
    

    如果你可以使用 IDENTIFIED 后跟 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.
    

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多