[英]javacc Expansion within "(...)+" can be matched by empty string error
[英]JavaCC: Matching an empty string
我遇到了含糊不清的令牌。 我的語法定義了兩個產品,形式為2e3或100e1的數字常量,以及形式為abc或uvw123的標識符 。
問題是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.