2015-05-11 63 views
3

作爲我撰寫系統的一部分,用戶可以創建自己的自定義規則,以便在發生某些事件時運行。將僞代碼轉換爲可用(使用正則表達式?)

有對象,他們可以用它來創建這些規則,都具有屬性和方法的一組數的一組數:

list of objects

所以按照規則的例子,我們可以說:

「如果這個單元獎項是‘區別’然後設置本機上所有標準獎‘取得’」

IF UNIT.award equals 「Distinction」 
THEN UNIT.criteria.set_award(‘A’) 

「否則,如果該單元獎項是‘優異’,然後設置任何標準獎勵給本單位的名字以‘P’或‘M’到‘取得’開始於」

IF UNIT.award equals 「Merit」 
THEN UNIT.criteria.filter(‘starts’, ‘name’, ‘P’, ‘M’).set_award(‘A’) 

「否則,如果該單元獎項是「通過,則設置任何標準獎勵給本單位,其名稱開頭的‘P’到‘取得’」

IF UNIT.award equals 「Merit」 
THEN UNIT.criteria.filter(‘starts’, ‘name’, ‘P’).set_award(‘A’) 

我遇到的問題是,我只是不知道如何把這個字符串對象,屬性&方法,例如「UNIT.criteria.filter('starts','name','P')。set_award('A')」並將其轉換爲可用的東西。

最終的結果,我想將字符串轉換爲將沿着線的東西:

example result

因此,我可以再轉化實際適當的對象,並返回相關的值或運行相關的方法。

因爲只需要一些我需要支持的東西(至少現在是這樣),而且我不需要像計算支持或變量那樣的任何複雜的東西,創建一個Lexer系統似乎矯枉過正,所以我在想只是使用正則表達式來分割所有的部分。因此,使用上面的例子,我可以對「。」字符進行簡單分割,但是如果該字符用於方法參數中,例如, 「CRITERION.filter('是','名稱','P.1')」然後將其完全擰緊。

我可以使用不太常見的字符來分割它們,例如雙冒號或「::」,但如果出於某種原因某人將其放入參數中,它仍會導致相同的問題。我已經嘗試創建一個正則表達式來分割字符,只有當它不在引號之間時,但我無法使其正常工作。

所以基本上我的問題是:一個正則表達式是否是最好的方法來做到這一點? (如果是這樣,任何人都可以幫助我讓它忽略指定的字符,如果它在方法中)。還是有另一種方式可以做到這一點,會更容易/更好?

謝謝。

+0

也許你應該搜索「表達式語言」。 「Symfony」排在我的搜索結果的頂部,例如, http://jwage.com/post/76799775984/using-the-symfony-expression-language-for-a-reward。 – JimmyB

+0

這需要使用Symfony本身,還是可以單獨使用?由於我們正在使用另一個CMS風格的系統,所以我無法爲此安裝整個框架。乾杯。 –

+0

不能說。乍一看,它似乎相當獨立:https://github.com/symfony/expression-language – JimmyB

回答

1

我認爲一個像雄辯一樣的ORM語言可以爲你做到這一點。

但是,如果我必須這樣做,那麼首先我會拆分IF THEN ELSE部分。 離開:

  1. UNIT.award等於「辨」
  2. UNIT.criteria.filter( '開始', '姓名', 'P', 'M')set_award( 'A')

我猜「等於」也可能是「不等於」或「更大」,所以...我會分開第一位。

/(?'ident'[a-z.]*?) (?'expression'equals|greater) (?'compare'[0-9a-z\「\」]+)/gi 

但是'等於'的爆炸會做同樣的事情。

然後我會圍繞點爆炸第二部分。 ,並提供:

  1. UNIT
  2. 標準
  3. 過濾器(A,B,C,d)
  4. set_ward(e)中

流行斷第一2中得到對象和屬性然後列出可能的過濾器和操作。

但坦率地說,我會開發一種語言,不會混合動作和過濾器的屬性。

喜歡的東西:

IF object.prop EQUALS const|var 
THEN UPDATE object.prop 
WITH const|var [WHERE object.prop filter const|var [AND|OR const|var]] 

口才確實它直接在PHP中:

DB::table('users') 
      ->where('id', 1) 
      ->update(['votes' => 1]); 

所以也許我會做這樣的事情:

THEN object.prop->filter(a,b,c,d)->set('award','A') 

這使得很容易分裂周圍的行動 - >和周圍的屬性。

無論如何... 我做我的正則表達式上https://regex101.com/ 希望這會有所幫助。

+0

這就是我最終做的事情。我已經擺脫了這些屬性,並將所有內容都放入了方法中,例如getCriteria(),getUnits()等...並擺脫了filter()方法,任何傳遞給get *()方法的變爲過濾器。 因此,我首先將點分成幾部分,然後執行遞歸函數來調用對象的剩餘方法或最後一次調用的結果。 E.g. Qual.getUnits()getCriteria()getAward() 。 - 調用getUnits()上資格賽OBJ - 由前一行 返回單位陣列調用getCriteria() - 對標準 的陣列調用getAward() 等 –

+0

聽起來像一個很酷的項目。 – Joeri

相關問題