簡體   English   中英

JavaCC:匹配一個空字符串

[英]JavaCC: Matching an empty string

我遇到了含糊不清的令牌。 我的語法定義了兩個產品,形式為2e3100e1的數字常量,以及形式為abcuvw123的標識符

問題是e1是有效的標識符,但也構成數字常量的一部分。 因此,例如,如果我的輸入包含2e3 ,它將被標記為數字,后跟標識符( 2 + e3 ),這不是我想要的。

我可以通過編寫包含e的更一般的正則表達式來匹配數字常量,而不是將其留給語法生成,但是令牌值/圖像將需要解析來分離整數和指數部分,這不是我想要的。 這不是我想要的。

我試圖通過使用標記化器狀態來解決此問題。 由於標識符不能以數字開頭,因此數字必須指示數字常量的開頭,因此我轉換為STATE_NUMBER 在這種狀態下,我定義了一個e標記來引用數字常量的指數部分。 然后我有一個“捕獲其他所有”令牌,意圖轉換回DEFAULT狀態。 在默認狀態下, e將與標識符regex匹配。

TOKEN : {
  < digit_sequence: (["0"-"9"])+ > : STATE_NUMBER
}

<STATE_NUMBER> TOKEN : {
  < exponent_prefix: "e" >
}

<STATE_NUMBER> MORE : {
  < end_number: ~[] > : DEFAULT
}

TOKEN : {
  < identifier: ["a"-"z"] (["0"-"9","a"-"z"])* >
}

這不能按預期工作。 MORE標記匹配的字符似乎被丟棄而不是成為標識符的第一個字符。

我想知道如何為此寫出正確的語法。 如果我不必使用任何內聯Java代碼,我更喜歡它。

問題是< end_number: ~[] > : DEFAULT匹配任何不是e字符。 你要匹配的是一個空字符串。 嘗試

< end_number: "" > : DEFAULT

我認為以下內容可行。

TOKEN : {
  < (["0"-"9"])+ > : STATE_NUMBER0
}

<STATE_NUMBER0> TOKEN : {
  < "e" > : STATE_NUMBER1
}

<STATE_NUMBER0> MORE : {
  < number_without_exponent: "" > : DEFAULT
}

<STATE_NUMBER1> MORE : {
   < number_with_exponent: (["0"-"9"])+ > : DEFAULT
}

這使123e成為錯誤, 123edf也是123edf 如果您不希望這些是錯誤,那么您可以減少一個狀態。

TOKEN : {
  < (["0"-"9"])+ > : STATE_NUMBER
}

<STATE_NUMBER> TOKEN : {
  < number_with_exponent: "e" (["0"-"9"])+ > : DEFAULT
}

<STATE_NUMBER> MORE : {
  < number_without_exponent: "" > : DEFAULT
}

這使得123e成為number_without_exponent后跟identifier “e”。 如果您希望它只是一個number_without_exponent ,請將最后一個+更改為*

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM