2010-05-17 33 views
2

我正在幫助我的侄子做他的C實驗室功課,這是一個字符串操作任務,並應用Wang的算法。C中的字符串操作

這裏是輸入的BNF表示。

<s> ::= <l> # <r> 

<l> ::= <list>| ε 
<r> ::= <list>| ε 
<list> ::= <f>|<f> , <list> 
<f> ::= <letter>| - <f>| (<f><op><f>) 
<op> ::= & | | | > 
<letter> ::= A |... | Z 

在C中處理和解析這種輸入的最佳做法是什麼?我如何解析這個結構而不使用struct?提前致謝。

+0

SO約定是爲家庭作業添加'homework'標籤:-) – 2010-05-17 09:05:15

+1

這不是嚴格的家庭作業(他不是直接要求解決某個練習),他要求最佳實踐,並且他明確聲明他正在幫助他的侄子,所以我認爲它不需要作業標籤... – Francesco 2010-05-17 09:29:11

回答

3

最直接的方法是使每個規則(或「生產」)的功能。這被稱爲「遞歸下降」解析器。

編寫兩個例程,可以偷看並獲取下一個字符。

這會給你一些代碼,看起來是這樣的(僞代碼):

// <sequent> ::= <lhs> # <rhs> 
sequent() 
    lhs() 
    if peekchar() != '#' then error 
    else poundsign = nextchar() 
    rhs() 


// <lhs> ::= <formulalist>| ε 
lhs() 
    if peekchar() == EOF 
     return 
    else 
     formula() 

// <rhs> ::= <formulalist>| ε 
rhs() 
    if peekchar() == EOF 
     return 
    else 
     formulalist() 

// <formulalist> ::= <formula>|<formula> , <formulalist> 
formulalist() 
    formula() 
    if peekchar() is ',' 
     comma = nextchar() 
     return formulalist() 

// <formula> ::= <letter>| - <formula>| (<formula><infixop><formula>) 
formula() 
    next = peekchar() 
    if next in A..Z 
     letter 
    else if next is - 
     minus_sign = nextchar() 
     return formula() 
    else 
     formula() 
     infixop() 
     formula() 

// <infixop> ::= & | | | > 
infixop() 
    c = nextchar() 
    if c not in &,|,> then error 

// <letter> ::= A | B | ... | Z 
letter() 
    c = nextchar() 
    if c not A..Z then error 

等等,每個規則。

總體思路:

  • 每個規則是一個函數
  • 在某些點的功能偷窺提前看看該怎麼辦。例如,formula()檢查第一個字符是否是負號。
+0

ε意味着「空」不是文件的結尾。您的LHS功能需要相應修改。另外,lhs稱fiormula而不是公式列表,我認爲這是一個錯字。 – JeremyP 2010-05-17 14:34:13

+1

感謝您的答覆,有一些進步,算法的作品。 – 2010-05-18 11:04:22

0

因爲您已經有了BNF,所以解析這種輸入的最簡單方法是使用解析器生成器。但由於這是作業,我不確定是否允許使用發電機。

不過,您也可以使用手寫解析器。只需要搜索遞歸下降解析器...