2013-05-26 54 views
1

在下面的語法中,我嘗試配置以'作爲單行註釋開始的任何行,以及/' Multiline Comment '/之間的任何行。單行註釋行得通。但出於某種原因,只要按/'或';'或<或'>'我得到下面的錯誤。我沒有配置上述字符。他們不應該被視爲默認並跳過解析?第0行第0列的詞法錯誤

錯誤

Lexical error at line 0, column 0. Encountered: "\"" (34), after : "" 
Lexical error at line 0, column 0. Encountered: ">" (62), after : "" 
Lexical error at line 0, column 0. Encountered: "\n" (10), after : "-" 

我只包括下面的代碼爲簡明的一部分。對於完整的Lexer定義請訪問link

TOKEN : 
{ 
    < WHITESPACE: 
    " " 
| "\t" 
| "\n" 
| "\r" 
| "\f"> 
} 

/* COMMENTS */ 

MORE : 
{ 
    <"/'"> { input_stream.backup(1); } : IN_MULTI_LINE_COMMENT 
} 

<IN_MULTI_LINE_COMMENT> 
TOKEN : 
{ 
    <MULTI_LINE_COMMENT: "'/" > : DEFAULT 
} 

<IN_MULTI_LINE_COMMENT> 
MORE : 
{ 
    < ~[] > 
} 

TOKEN : 
{ 
    <SINGLE_LINE_COMMENT: "'" (~["\n", "\r"])* ("\n" | "\r" | "\r\n")?> 
} 

回答

3

我無法複製您的問題的每個方面。你說有一個錯誤「」儘快「你輸入某些字符。這是我得到的。

  • /沒有錯誤,除非下一個字符是不是一個'。如果下一個字符不是',則會出現錯誤。
  • '我沒有看到任何錯誤。這被正確對待作爲評論的開始
  • ;總是有一個錯誤。沒有令牌可以從;開始。
  • <如果下一個字符不是-<-,那麼只有一個錯誤。
  • >總是有錯誤。沒有令牌可以與>

開始我不知道是什麼原因,你會期望這些不被錯誤的,因爲你的詞法分析器沒有規則來覆蓋這些案件。通常,當沒有規則匹配輸入的前綴並且輸入沒有用盡時,將會拋出一個TokenMgrError

如果你想消除所有這些TokenMgrError S,做一個包羅萬象的規則(如FAQ解釋):

TOKEN: { <UNEXPECTED_CHARACTER: ~[] > } 

確認這是在的.jj文件中的最後一個規則。這條規則說,當沒有其他規則適用時,下一個字符將被視爲一個UNEXPECTED_CHARACTER標記。當然,這隻會引發問題達到解析級別。如果你真的想標記生成器跳過不屬於所有字符,只要使用以下規則作爲最後的規則:

SKIP : { < ~[] > } 

對於大多數語言,這將是一個奇怪的事情,這這就是爲什麼它不是默認值。

+0

昨天我嘗試過的一件事包括'TOKEN:{}'這可能不是因爲其他原因。我說'只要我輸入',因爲我正在開發這個詞法分析器,以在IDE中提供語法高亮度。我還沒有實施解析器的計劃,所以如果我跳過不屬於該語言的字符,那就足夠了。 我昨天整天都在試圖解決這個問題,並且在看到您的答案後能夠在今天早上一次性修復它。我想他們稱你爲科學家的原因:)。像這樣的答案應該至少獲得100分。謝謝。 – ShaggyInjun

+0

謝謝。你一直都有解決方案。項目祝你好運。 –

相關問題