2013-04-25 53 views
0

我最近被授權爲虛構語言編寫ANTLR3語法。一切似乎都很好,但我遇到了一些小問題,我可以用一些幫助來做:ANTLR3字符串文字和禁止嵌套註釋

1)註釋在'/*''*/'之間,可能不是嵌套的。我知道如何自己實施評論('/*' .* '*/'),但我會如何去禁止他們的嵌套?

2)字符串文字被定義爲一對雙引號之間的任何字符序列(雙引號和新行除外)。它們只能用在輸出語句中。我試圖這樣定義的:

output : OUTPUT (STRINGLIT | IDENT) ; 
STRINGLIT : '"' ~('\r' | '\n' | '"')* '"' ; 

出於某種原因,然而,解析器接受

OUTPUT "Hello, 
World!" 

和tokenises它作爲"Hello, \nWorld。感嘆號或關閉"去了,我不知道。可能與空白有關?

WHITESPACE : ('\t' | ' ' | '\n' | '\r' | '\f')+ { $channel = HIDDEN; } ; 

任何意見將不勝感激 - 感謝您的時間! :)

回答

0
  1. 您寫的表單已經不允許嵌套註釋。即使在註釋中出現多個/*序列,令牌也會在第一個*/實例處停止。要允許嵌套註釋,您必須編寫一個詞法分析規則來專門處理嵌套。

  2. 這裏的問題是STRINGLIT不允許將字符串拆分爲多行。在沒有看到其他詞法分析器規則的情況下,我無法告訴您這是如何標記的,但從您給出的STRINGLIT規則可以清楚地看出,示例輸入不是有效的字符串。

注意:您在原始問題中給出的輸入不清楚,因此我重新格式化了它以嘗試顯示您正在使用的確切輸入。你能證實我的編輯能正確表示輸入嗎?

+0

非常感謝280Z28 - 你對非嵌套性質完全正確,我不相信我沒有發現!你的編輯確實代表了輸入 - 謝謝! 我需要澄清第2點:不應允許STRINGLIT跨多行分割,但使用我定義的語法,解釋器允許我這樣做,輸出顯示在上面。我不確定爲什麼會出現這種情況! – 2013-04-25 16:33:31

+0

ANTLR 3 *解釋器*經常產生不正確的結果。您是否嘗試過運行實際的解析器? – 2013-04-25 16:43:06