2015-09-03 137 views
0

在我的應用程序具有用戶可以輸入自定義語法: IF(ROW1> ROW2; 4; ROW1 + ROW2) 或更復雜的東西: IF(ROW1> ROW2; IF(ROW1> ROW2; 4; ROW1/IF(ROW1> ROW2; 4; ROW1 - ROW2)); ROW1 + ROW2)驗證自定義語法

我想很明顯的輸出會是怎樣的第〔實施例: 如果ROW1比ROW2大於結果將會是4個ROW1 + ROW2。

如果我不能使用任何外部庫,在java中驗證這種自定義語法的最佳方法是什麼? 從我讀過的RegEx不會幫助,因爲它無法處理嵌套的括號。

我唯一的想法就是:

  • Valdiate如果括號是平衡的;
  • 驗證操作符的鄰居(關係和計算),只能有行,數字和關係其他IF語句;
  • 最後驗證IF語句的結構(遞歸);

所有這些都將在一個解析器中完成,它將逐個處理每個字符。

有沒有更聰明的想法做這個驗證?

+2

看起來你正在嘗試創建自己的語言。如果是這樣的話,你可以使用類似ANTLR的東西來爲你生成一個解析器和詞法分析器,然後使用它。 – Zarwan

+0

另請參見Flex/JFlex系列工具和GNU Bison之類的東西,雖然這可能比您要找的更重量級。 – mvd

+0

爲什麼你不能使用外部庫?你在這裏創建的基本上是一個解釋器(用於簡單的語言)。這是一個有點棘手,但解決問題。除非你的目標是學習如何撰寫口譯員,否則你只是通過限制你的工具爲自己創造工作。 –

回答

1

如果ANTLR的使用不如評論中的建議,我會使用堆棧並轉換您的表達式from infix to postfix form

在上面鏈接中的文章中只觀察到數學運算,但是您可以在代碼中擴展可能的操作,並添加if和比較運算符。

之後,您可以使用堆棧評估您的表達式。