2015-11-29 121 views
0

我想解析MS的SQL方言。根據規範一個「頂部」必須具有括號圍繞其表達antlr4詞法分析器/解析器衝突由於歧義

選擇頂部(@rows * 2)的a,b,從C ...

但作爲一個例外,這些可以被省略,如果的值是一個無符號的整數字面,從而

選擇頂部75的a,b,從C ...

我試圖嵌入在我的解析器(鬆散地)本字面整數特例:

top_clause:'TOP'[0-9] + | 'TOP''('表達')';

所以第一個選擇是純粹的詞法分析規則,第二個是解析器規則。由於整數常量是一個有效的表達式,因此它選擇將其解析爲一個表達式。

問題是,1)我可以強制它作爲詞法分析規則進行匹配嗎?2)最重要的是,我應該嗎?我的猜測是我不應該 - 這是一個公然的含糊(真的,在我的語法錯誤),我想我應該匹配它作爲一個純粹的解析器規則(只是「TOP」表達式),並對其進行排序退出後。 建議歡迎。

編輯:根據Matt Timmermans的觀點修正。

+0

你不想'TOP'[0-9] + | 'TOP''('表達')''? –

+0

那麼,表達式已經被定義爲**'('expression')'**,並且因爲我期望刪除詞法分析器規則,所以我在這裏跳過了它們(因爲我不想如果表達式的其餘部分只是一個整數,則需要它們)。但是,是的,你是對的。將編輯。 – user3779002

+0

現在它不含糊 –

回答

0

答案取決於你實際想要達到什麼,但我的猜測是你想讓TOP和數字之間的空格。如果將此定義爲詞法分析規則,則必須在其中明確指定空格。有了解析器規則,這是不必要的,因爲(我在這裏再次猜測)你有一個跳過空白的詞法規則。

我推薦的是,您總是將您的文字定義爲詞法分析規則(在解析器規則中沒有'TOP',沒有數字)並保持原樣,只要使用新的詞法分析規則(以及小的重構) :

DIGITS: [0-9]+; 
TOP: 'TOP'; 
OPEN_PAR: '('; 
CLOSE_PAR: ')'; 

top_clause: TOP (DIGITS | OPEN_PAR expression CLOSE_PAR); 
+0

嗨,不,它不是空白,只是'頂部'構造有一個特殊的情況沒有括號,需要,如果只是數字;我應該用自己的詞法規則來對待這個特殊情況嗎?馬特Timmermans說不,這聽起來是正確的。回覆。詞法分析規則,我簡化了這篇文章;我所有的練習都是按照命名規則完成的,唯一例外的是('和')',根據你的要求,我現在會遵守規則。 – user3779002

+0

小記 - ANTLR的詞法分析器功能如此強大,我使用它來代替分析器來解決複雜結構,從而引發了自己的問題。向其他人暗示 - 將所有結構放在解析器中並保持簡單。 – user3779002