2010-02-24 87 views
0

我想解析一些文本記錄,其中記錄中的元素由'+'字符分隔,並且整個記錄由'#'字符終止。例如E1 + E2 + E3 + E4 + E5 + E6#ANTLR解析器問題

單個元素可能是必需的或可選的。如果一個元素是可選的,它的值就會丟失。例如,如果E2丟失,輸入字符串將爲:E1 ++ E3 + E4 + E5 + E6#。

但是,在處理空尾元素時,分隔符char('+')也可能丟失。例如,如果最後3個元素丟失,字符串可能是:E1 + E2 + E3#,但它也可能是: E1 + E2 + E3 +++#

我在Antlr中試過以下規則:

'R1''E1 + E2 + E3''+'? 'E4'? '+'? 'E5'? '+'? 'E6'? '#

但是Antlr抱怨說這當然是正確的(E3之後的每個標記都可能是E4,E5或E6)。輸入語法是固定的(它來自傳統的大型機系統),所以我想知道是否有人可以解決這個問題?

另一種方法是在規則中指定所有不同的排列,但這將是一項重大任務。

最好的問候和感謝,

邁克爾

+0

你能發佈*所有*你的詞法分析規則嗎? (假設它們不是那麼多) – 2010-02-24 21:22:42

回答

0

如果這是模糊的,很可能是因爲您的E一切都具有相同的格式(一個更復雜的情況是,你的E一切只是開始與同樣的k字符,其中k是你的向前看,但我會認爲情況並非如此,如果是這樣,它仍然可以工作;它只需要一個額外的步驟。)

因此,它看起來像你可以有最多6 E sa最多5 + s。我們會說一個「細分」是一個可選的E,然後是一個+ - 您可以有5個細分市場,以及一個可選尾部E

此語法可以表示大致是這樣(不完美的ANTLR語法因爲我不是很熟悉):

r : (e_opt? PLUS){1,5} e_opt? END 
e_opt : E // whatever your E is 
PLUS : '+' 
END : '#' 

如果ANTLR不支持這樣{1,5}東西,那麼這是一樣的:

(e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) ((e_opt? PLUS) (e_opt? PLUS)?)?)?)? 

這不是那麼幹淨,所以也許有更好的方法來做到這一點。

+0

ANTLR不支持'{a,b}'。 – 2010-02-24 21:23:09

+0

嘿巴特, 這是一個偉大的提示 - 感謝您的時間,我真的很感激它。 Brgds和謝謝, 邁克爾 – 2010-02-26 09:55:29

+0

評論應該是「danben」 - 謝謝。但你是對的巴特。 Antlr的reggular表達支持可能會更好。 – 2010-02-26 10:00:54

1

對於ANTLR來說,這個任務聽起來像是過度殺傷了任何理由,你只是沒有用'+'作爲分隔符將字符串拆分成數組?

如果它來自大型機,它最有可能被打算處理一個微不足道的方式。

例如,
C++:http://www.cplusplus.com/reference/clibrary/cstring/strtok/
PHP:http://us3.php.net/manual/en/function.explode.php
的Java:http://java.sun.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29
C#:http://msdn.microsoft.com/en-us/library/system.string.split%28VS.71%29.aspx

只是一個想法。

+0

由於我們不知道他的表達式值(Es)如何解析,所以正則表達式可能不合適。 – danben 2010-02-24 22:29:05

+0

嗨沃爾特, 它比問題提出的一系列不同的消息,數據結構等更復雜,但無論如何感謝。 Brgds, Michael – 2010-02-26 09:56:37