2017-04-09 44 views
0

我需要從這個建立解析嘗試/分析儀:句法分析器

x (x | "x+y")* x+ y 

現在我有語法:

S -> x A x B y 
A -> x A 
A -> x+y A 
A -> epsilon 
B -> x B 
B -> epsilon 

和代碼如下所示:

S() { 
    if (token == 'x') { 
     A(); 
     if (token == 'x') { 
      B(); 
      if (token == 'y') { 
       // success 
      } else { 
       // syntax err 
      } 
     } else { 
      // syntax err 
     } 
    } else { 
     // syntax err 
    } 
} 

A() { 
    if (token == 'x') { 
     if (token == '+') { 
      if (token == 'y') { 
       A(); 
      } else { 
       // syntax err 
      } 
     } else { 
      A(); 
     } 
    } else { 
     // epsilon 
    } 
} 

B() { 
    if (token == 'x') { 
     B(); 
    } else { 
     // epsilon 
    } 
} 

問題是B()從主S()函數永遠不會被稱爲cuz A()函數由於(x | "x+y")*週期而獲取所有x標記。例如: xxxxx+yx+yx+yxxxxxy 如何解決我的問題並解析它? 我在做什麼錯?

p.s.遺憾的英語,TNX注意力

+0

您正則表達式'X(X | 「X + Y」)* X + y'與正則表達式'x(x |「x + y」)* xy'相等,因爲除了最後一個x以外的每一個x都可以被kleene星吃掉。 – user1937198

+0

它是,但問題仍然存在,'A()'函數獲取所有'x'標記,當執行'if(標記=='x')...'表達式將是錯誤的 –

回答

0

我猜的解決方案是在這個語法:

S -> x A 
A -> x A 
A -> x+y A 
A -> xy 

等,問題就會消失