2016-01-21 33 views
1

我在寫一個小程序,它需要預處理一些輸入到另一個程序的數據文件。正因爲如此,我無法改變輸入文件的格式,並且遇到了問題。數據文件的Lexer/Parser設計

我正在使用一種沒有圖書館的語言,我不介意這個練習,所以我打算用手工實現詞法分析器和解析器。我想實現一個基於this的Lexer,這是一個相當簡單的設計。

我需要解釋的輸入文件有一個包含化學反應的部分。反應各側的不同化學物質以'+'符號分隔,但物種的名稱也可以具有+字符(象徵電荷)。例如:

N2+O2=>NO+NO 
N2++O2-=>NO+NO 
N2+ + O2 => NO + NO 

都是有效的,並輸出通過令牌詞法分析器應

'N2' '+' 'O2' '=>' 'NO' '+' 'NO' 
'N2+' '+' 'O2-' '=>' 'NO' '+' 'NO' 
'N2+' '+' 'O2-' '=>' 'NO' '+' 'NO' 

(請注意,最後兩個是相同的)。爲了簡單起見,我想避免在詞法分析器中向前看。問題在於詞法分析器將開始讀取上述任何輸入,但是當它到達第三個字符(第一個'+')時,它將無法知道它是否是物種名稱的一部分或者如果它是反應物之間的分隔物。

爲了解決這個問題,我想我只想分裂它關閉,因此第二和第三實施例上面就輸出:

'N2' '+' '+' 'O2-' '=>' 'NO' '+' 'NO' 

解析器然後將簡單地使用上下文,實現在這兩個「+」記號行意味着第一個是以前物種名稱的一部分,並且會正確處理以上三種情況。這個問題是,現在想象我試圖解析/解析

N2 + + O2- => NO + NO 

(注意'N2'和第一個'+'之間的空格)。這是無效的語法,但是我剛剛描述的詞法分析器會輸出與第二個和第三個示例完全相同的標記輸出,並且我的分析器將無法捕獲該錯誤。

所以可能的解決辦法,因爲我看到它:

  • 實現一個詞法分析器用於至少一個字符向前看
  • 包括空白符
  • 包括在「+」令牌前導空格
  • 創建一個「組合」標記,其中包括物種名稱和任何尾隨的「+」,然後讓解析器確定「+」是否實際上是名稱的一部分。

因爲我對這種編程非常陌生,所以希望有人能評論我提出的解決方案(或者建議其他解決方案)。我對第一個解決方案的主要預測是我根本不知道用展望實現一個詞法分析器會有多複雜。

回答

1

你沒有提到你的實現語言,但是輸入的語法與你所概述的輸入語法相對簡單,我不認爲沿着下面的僞代碼的邏輯是不合理的。

string GetToken() 
{ 
    string token = GetAlphaNumeric(); // assumed to ignore (eat) white-space 

    var ch = GetChar(); // assumed to ignore (eat) white-space 

    if (ch == '+') 
    { 
    var ch2 = GetChar(); 

    if (ch2 == '+') 
     token += '+'; 
    else 
     PutChar(ch2); 
    } 

    PutChar(ch); 

    return token; 
} 
+0

所以這實質上是展望未來的一個字符?我在Matlab工作(由於項目的其他要求,這也是爲什麼目前沒有任何建立良好的庫),所以我甚至實現了一個非常輕的字符流類。我想在下一個角色中添加一個'偷看'會相當簡單。 –

+0

對。根據需要,您可能有辦法臨時前進和倒回輸入緩衝區指針,但是如果走這條路線,請注意空白區域。 –

+0

是的,我將不得不小心細節,但我做的閱讀越多,我認爲擁有這種能力就越有用。 –