2014-10-18 214 views
1

我的JavaCC項目出現了一些問題。我試圖識別一個變量聲明,它有一個可能的「變量」前綴,一種變量名稱和變量(id)。但解析器將第一個單詞識別爲kind,並且不會繼續執行該行的其餘部分。JavaCC在令牌中識別令牌

它說:

Exception in thread "main" ParseException: Encountered " <KIND> "char "" at line 2, column 9. 
Was expecting one of: 
<VARIABLE> ... 

這裏是我的令牌如何申報

TOKEN : 
{ 
    <START: "start"> {debugStream.println("start");} 
    | <END: "end"> {debugStream.println("end");} 
    | <VARIABLE: ("variable" <KIND> <ID>) | (<KIND> <ID>)> {debugStream.println("variable decl");} 
    | <KIND: "integer"|"real"|"logic"|"char"|"text"> {debugStream.println("kind");} 
    | <ID: (["a"-"z","_"])+> {debugStream.println("id");} 
} 

我也試圖把種類和ID爲special_tokens,然後解析器不用錯誤,但不要也不承認變量聲明。

編輯:

這裏的輸入字符串

start 
    char sex 
    integer num 
end 
+0

你沒有說什麼定義'TYPE'。你也可以顯示輸入字符串。 – 2014-10-18 17:58:01

+0

對不起@TheodoreNorvell。我已編輯帖子以添加輸入字符串。這是一個非常簡單的。沒有TYPE,它只是一個錯字。 – bfagundes 2014-10-18 22:01:19

回答

1

如果你真的想要的「焦炭性」來標記作爲一種VARIABLE一個令牌,那麼你需要允許VARIABLE小號空間。例如。

<VARIABLE: ("variable" (" ")+ <KIND> (" ")+ <ID>) | (<KIND> (" ")+ <ID>)> 

不過,我建議你考慮執行下列操作:更改VARIABLE規則

<VARIABLE: "variable"> 

寫一個新的非終結

void variable() : {} { 
    <VARIABLE> <KIND> <ID> 
| 
    <KIND> <ID> 
}